From dbb17326488f558a2773c74dbc1d27bb3b09df34 Mon Sep 17 00:00:00 2001 From: FongMi Date: Wed, 18 Oct 2023 17:16:13 +0800 Subject: [PATCH] Fix bug --- .../com/fongmi/android/tv/bean/Channel.java | 9 +++++++ .../com/fongmi/android/tv/bean/Result.java | 10 ++++++++ .../com/fongmi/android/tv/player/ExoUtil.java | 24 +++++++++++++++---- .../com/fongmi/android/tv/player/Source.java | 12 +++++++--- .../android/tv/player/extractor/BiliBili.java | 5 ++++ .../android/tv/player/extractor/Force.java | 5 ++++ .../android/tv/player/extractor/JianPian.java | 5 ++++ .../android/tv/player/extractor/Push.java | 5 ++++ .../android/tv/player/extractor/TVBus.java | 5 ++++ .../android/tv/player/extractor/Thunder.java | 5 ++++ .../android/tv/player/extractor/Youtube.java | 5 ++++ .../android/tv/player/extractor/ZLive.java | 5 ++++ 12 files changed, 87 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Channel.java b/app/src/main/java/com/fongmi/android/tv/bean/Channel.java index 36f002b22..e411f130b 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Channel.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Channel.java @@ -43,6 +43,7 @@ public class Channel { private Drm drm; private boolean selected; + private boolean cache; private Group group; private String url; private Epg data; @@ -195,6 +196,14 @@ public class Channel { this.selected = item.equals(this); } + public boolean isCache() { + return cache; + } + + public void setCache(boolean cache) { + this.cache = cache; + } + public int getLineVisible() { return isOnly() ? View.GONE : View.VISIBLE; } 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 61cf52b4a..02e8ece89 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 @@ -75,6 +75,8 @@ public class Result implements Parcelable { @JsonAdapter(MsgAdapter.class) @SerializedName("msg") private String msg; + @SerializedName("cache") + private boolean cache; public static Result objectFrom(String str) { try { @@ -260,6 +262,14 @@ public class Result implements Parcelable { this.msg = msg; } + public boolean isCache() { + return cache; + } + + public void setCache(boolean cache) { + this.cache = cache; + } + public boolean hasMsg() { return getMsg().length() > 0; } 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 0acc2789a..36c920737 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 @@ -16,7 +16,9 @@ import androidx.media3.datasource.DefaultHttpDataSource; import androidx.media3.datasource.HttpDataSource; import androidx.media3.datasource.cache.Cache; import androidx.media3.datasource.cache.CacheDataSource; +import androidx.media3.datasource.cache.CacheEvictor; import androidx.media3.datasource.cache.LeastRecentlyUsedCacheEvictor; +import androidx.media3.datasource.cache.NoOpCacheEvictor; import androidx.media3.datasource.cache.SimpleCache; import androidx.media3.datasource.okhttp.OkHttpDataSource; import androidx.media3.exoplayer.DefaultLoadControl; @@ -56,10 +58,13 @@ import okhttp3.Call; public class ExoUtil { + private static LeastRecentlyUsedCacheEvictor usedCacheEvictor; private static HttpDataSource.Factory httpDataSourceFactory; private static DataSource.Factory dataSourceFactory; private static ExtractorsFactory extractorsFactory; + private static NoOpCacheEvictor noOpCacheEvictor; private static DatabaseProvider database; + private static CacheEvictor evictor; private static Cache cache; public static LoadControl buildLoadControl() { @@ -105,18 +110,19 @@ public class ExoUtil { } public static MediaSource getSource(Result result, int errorCode) { - return getSource(result.getHeaders(), result.getRealUrl(), result.getFormat(), result.getSubs(), null, errorCode); + return getSource(result.getHeaders(), result.getRealUrl(), result.getFormat(), result.getSubs(), null, errorCode, result.isCache()); } public static MediaSource getSource(Channel channel, int errorCode) { - return getSource(channel.getHeaders(), channel.getUrl(), null, Collections.emptyList(), channel.getDrm(), errorCode); + return getSource(channel.getHeaders(), channel.getUrl(), null, Collections.emptyList(), channel.getDrm(), errorCode, channel.isCache()); } public static MediaSource getSource(Map headers, String url, int errorCode) { - return getSource(headers, url, null, Collections.emptyList(), null, errorCode); + return getSource(headers, url, null, Collections.emptyList(), null, errorCode, false); } - private static MediaSource getSource(Map headers, String url, String format, List subs, Drm drm, int errorCode) { + private static MediaSource getSource(Map headers, String url, String format, List subs, Drm drm, int errorCode, boolean cache) { + checkEvictor(cache); Uri uri = Uri.parse(Util.fixUrl(url)); String mimeType = getMimeType(format, errorCode); if (uri.getUserInfo() != null) headers.put(HttpHeaders.AUTHORIZATION, Util.basic(uri)); @@ -164,6 +170,14 @@ public class ExoUtil { player.setTrackSelectionParameters(player.getTrackSelectionParameters().buildUpon().setOverrideForType(new TrackSelectionOverride(player.getCurrentTracks().getGroups().get(group).getMediaTrackGroup(), trackIndices)).build()); } + private static void checkEvictor(boolean cache) { + if (noOpCacheEvictor == null) noOpCacheEvictor = new NoOpCacheEvictor(); + if (usedCacheEvictor == null) usedCacheEvictor = new LeastRecentlyUsedCacheEvictor(100 * 1024 * 1024); + CacheEvictor evictor = cache ? usedCacheEvictor : noOpCacheEvictor; + if (!evictor.equals(ExoUtil.evictor)) reset(); + ExoUtil.evictor = evictor; + } + 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; @@ -190,7 +204,7 @@ public class ExoUtil { } private static synchronized Cache getCache() { - if (cache == null) cache = new SimpleCache(Path.exo(), new LeastRecentlyUsedCacheEvictor(100 * 1024 * 1024), getDatabase()); + if (cache == null) cache = new SimpleCache(Path.exo(), evictor, getDatabase()); return cache; } diff --git a/app/src/main/java/com/fongmi/android/tv/player/Source.java b/app/src/main/java/com/fongmi/android/tv/player/Source.java index 6c03adc2a..5f2937cb0 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/Source.java +++ b/app/src/main/java/com/fongmi/android/tv/player/Source.java @@ -49,14 +49,18 @@ public class Source { public String fetch(Result result) throws Exception { String url = result.getUrl().v(); Extractor extractor = getExtractor(url); - if (extractor != null) result.setParse(0); - return extractor == null ? url : extractor.fetch(url); + if (extractor == null) return url; + result.setParse(0); + result.setCache(extractor.useCache()); + return extractor.fetch(url); } public String fetch(Channel channel) throws Exception { String url = channel.getCurrent().split("\\$")[0]; Extractor extractor = getExtractor(url); - return extractor == null ? url : extractor.fetch(url); + if (extractor == null) return url; + channel.setCache(extractor.useCache()); + return extractor.fetch(url); } public void stop() { @@ -71,6 +75,8 @@ public class Source { public interface Extractor { + boolean useCache(); + boolean match(String scheme, String host); String fetch(String url) throws Exception; diff --git a/app/src/main/java/com/fongmi/android/tv/player/extractor/BiliBili.java b/app/src/main/java/com/fongmi/android/tv/player/extractor/BiliBili.java index 8a7eeed6e..4664ae16a 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/extractor/BiliBili.java +++ b/app/src/main/java/com/fongmi/android/tv/player/extractor/BiliBili.java @@ -12,6 +12,11 @@ import okhttp3.Headers; public class BiliBili implements Source.Extractor { + @Override + public boolean useCache() { + return false; + } + @Override public boolean match(String scheme, String host) { return "live.bilibili.com".equals(host); diff --git a/app/src/main/java/com/fongmi/android/tv/player/extractor/Force.java b/app/src/main/java/com/fongmi/android/tv/player/extractor/Force.java index a80497553..d6837c32d 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/extractor/Force.java +++ b/app/src/main/java/com/fongmi/android/tv/player/extractor/Force.java @@ -22,6 +22,11 @@ public class Force implements Source.Extractor { private final HashSet set = new HashSet<>(); + @Override + public boolean useCache() { + return false; + } + @Override public boolean match(String scheme, String host) { return !scheme.equals("push") && scheme.startsWith("p") || scheme.equals("mitv"); diff --git a/app/src/main/java/com/fongmi/android/tv/player/extractor/JianPian.java b/app/src/main/java/com/fongmi/android/tv/player/extractor/JianPian.java index b32a04518..a44d9c4c0 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/extractor/JianPian.java +++ b/app/src/main/java/com/fongmi/android/tv/player/extractor/JianPian.java @@ -13,6 +13,11 @@ public class JianPian implements Source.Extractor { private P2PClass p2p; private String path; + @Override + public boolean useCache() { + return true; + } + @Override public boolean match(String scheme, String host) { return scheme.equals("tvbox-xg") || scheme.equals("jianpian"); diff --git a/app/src/main/java/com/fongmi/android/tv/player/extractor/Push.java b/app/src/main/java/com/fongmi/android/tv/player/extractor/Push.java index ceecfd0b5..e9636c9aa 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/extractor/Push.java +++ b/app/src/main/java/com/fongmi/android/tv/player/extractor/Push.java @@ -11,6 +11,11 @@ import com.fongmi.android.tv.ui.activity.VideoActivity; public class Push implements Source.Extractor { + @Override + public boolean useCache() { + return false; + } + @Override public boolean match(String scheme, String host) { return scheme.equals("push"); diff --git a/app/src/main/java/com/fongmi/android/tv/player/extractor/TVBus.java b/app/src/main/java/com/fongmi/android/tv/player/extractor/TVBus.java index bf8268762..32370b341 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/extractor/TVBus.java +++ b/app/src/main/java/com/fongmi/android/tv/player/extractor/TVBus.java @@ -15,6 +15,11 @@ public class TVBus implements Source.Extractor, Listener { private String hls; private Core core; + @Override + public boolean useCache() { + return false; + } + @Override public boolean match(String scheme, String host) { return scheme.equals("tvbus"); diff --git a/app/src/main/java/com/fongmi/android/tv/player/extractor/Thunder.java b/app/src/main/java/com/fongmi/android/tv/player/extractor/Thunder.java index e6c0526c9..6b7414151 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/extractor/Thunder.java +++ b/app/src/main/java/com/fongmi/android/tv/player/extractor/Thunder.java @@ -18,6 +18,11 @@ public class Thunder implements Source.Extractor { private GetTaskId taskId; + @Override + public boolean useCache() { + return true; + } + @Override public boolean match(String scheme, String host) { return scheme.equals("magnet") || scheme.equals("ed2k"); diff --git a/app/src/main/java/com/fongmi/android/tv/player/extractor/Youtube.java b/app/src/main/java/com/fongmi/android/tv/player/extractor/Youtube.java index 132a47c89..2b6a84abf 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/extractor/Youtube.java +++ b/app/src/main/java/com/fongmi/android/tv/player/extractor/Youtube.java @@ -23,6 +23,11 @@ import okhttp3.Headers; public class Youtube implements Source.Extractor { + @Override + public boolean useCache() { + return false; + } + @Override public boolean match(String scheme, String host) { return host.contains("youtube.com") || host.contains("youtu.be"); diff --git a/app/src/main/java/com/fongmi/android/tv/player/extractor/ZLive.java b/app/src/main/java/com/fongmi/android/tv/player/extractor/ZLive.java index 2c22c1025..fa96a97b2 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/extractor/ZLive.java +++ b/app/src/main/java/com/fongmi/android/tv/player/extractor/ZLive.java @@ -9,6 +9,11 @@ public class ZLive implements Source.Extractor { private final String BASE = "http://127.0.0.1:6677/stream/"; private boolean init; + @Override + public boolean useCache() { + return false; + } + public void init() { //com.east.android.zlive.ZLive.INSTANCE.OnLiveStart(6677); //init = true;