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 f6a44b971..b5c5793b3 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 @@ -52,7 +52,7 @@ public class Result { @SerializedName("url") private String url; @SerializedName("sub") - private String sub; + private List sub; public static Result fromJson(String str) { try { @@ -165,8 +165,8 @@ public class Result { this.url = url; } - public String getSub() { - return TextUtils.isEmpty(sub) ? "" : sub; + public List getSub() { + return sub == null ? Collections.emptyList() : sub; } public void clear() { diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Sub.java b/app/src/main/java/com/fongmi/android/tv/bean/Sub.java new file mode 100644 index 000000000..9db0cf166 --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/bean/Sub.java @@ -0,0 +1,39 @@ +package com.fongmi.android.tv.bean; + +import android.net.Uri; +import android.text.TextUtils; + +import com.google.android.exoplayer2.MediaItem; +import com.google.gson.annotations.SerializedName; + +public class Sub { + + @SerializedName("url") + private String url; + @SerializedName("name") + private String name; + @SerializedName("lang") + private String lang; + @SerializedName("format") + private String format; + + public String getUrl() { + return TextUtils.isEmpty(url) ? "" : url; + } + + public String getName() { + return TextUtils.isEmpty(name) ? "" : name; + } + + public String getLang() { + return TextUtils.isEmpty(lang) ? "zh" : lang; + } + + public String getFormat() { + return TextUtils.isEmpty(format) ? "" : format; + } + + public MediaItem.SubtitleConfiguration getExoSub() { + return new MediaItem.SubtitleConfiguration.Builder(Uri.parse(getUrl())).setLabel(getName()).setMimeType(getFormat()).setLanguage(getLang()).build(); + } +} 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 1c16dd03f..0e424d599 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 @@ -2,10 +2,10 @@ package com.fongmi.android.tv.player; import android.graphics.Color; import android.net.Uri; -import android.text.TextUtils; import com.fongmi.android.tv.App; import com.fongmi.android.tv.bean.Result; +import com.fongmi.android.tv.bean.Sub; import com.fongmi.android.tv.utils.FileUtil; import com.fongmi.android.tv.utils.Prefers; import com.google.android.exoplayer2.DefaultRenderersFactory; @@ -34,6 +34,7 @@ import com.google.android.exoplayer2.upstream.cache.SimpleCache; import com.google.android.exoplayer2.util.MimeTypes; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; @@ -64,32 +65,28 @@ public class ExoUtil { } public static MediaSource getSource(Map headers, String url, int errorCode) { - return getSource(headers, url, null, errorCode); + return getSource(headers, url, Collections.emptyList(), errorCode); } - private static MediaSource getSource(Map headers, String url, String sub, int errorCode) { + private static MediaSource getSource(Map headers, String url, List sub, int errorCode) { return new DefaultMediaSourceFactory(getDataSourceFactory(headers), getExtractorsFactory()).createMediaSource(getMediaItem(url, sub, errorCode)); } - private static MediaItem getMediaItem(String url, String sub, int errorCode) { + private static MediaItem getMediaItem(String url, List sub, int errorCode) { MediaItem.Builder builder = new MediaItem.Builder().setUri(Uri.parse(url.trim())); if (errorCode == PlaybackException.ERROR_CODE_PARSING_MANIFEST_MALFORMED) builder.setMimeType(MimeTypes.APPLICATION_OCTET); else if (errorCode == PlaybackException.ERROR_CODE_PARSING_CONTAINER_UNSUPPORTED) builder.setMimeType(MimeTypes.APPLICATION_M3U8); - if (!TextUtils.isEmpty(sub)) builder.setSubtitleConfigurations(getSubtitles(sub)); + if (sub.size() > 0) builder.setSubtitleConfigurations(getSubtitles(sub)); builder.setAllowChunklessPreparation(Prefers.getDecode() == 1); return builder.build(); } - private static List getSubtitles(String sub) { + private static List getSubtitles(List sub) { List items = new ArrayList<>(); - for (String text : sub.split("\\$\\$\\$")) items.add(getSubtitle(text.split("#"))); + for (Sub item : sub) items.add(item.getExoSub()); return items; } - private static MediaItem.SubtitleConfiguration getSubtitle(String[] split) { - return new MediaItem.SubtitleConfiguration.Builder(Uri.parse(split[2])).setLabel(split[0]).setMimeType(split[1]).setLanguage("zh").build(); - } - private static synchronized ExtractorsFactory getExtractorsFactory() { if (extractorsFactory == null) extractorsFactory = new DefaultExtractorsFactory().setTsExtractorFlags(DefaultTsPayloadReaderFactory.FLAG_ENABLE_HDMV_DTS_AUDIO_STREAMS).setTsExtractorTimestampSearchBytes(TsExtractor.DEFAULT_TIMESTAMP_SEARCH_BYTES * 3); return extractorsFactory;