From 9955dfa9b8023dac6fde5add3ff1e6ed126970ff Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 27 Feb 2025 13:13:29 +0800 Subject: [PATCH] Optimize danmaku load --- .../com/fongmi/android/tv/api/Decoder.java | 4 ++-- .../android/tv/api/config/LiveConfig.java | 3 ++- .../android/tv/api/config/VodConfig.java | 3 ++- .../com/fongmi/android/tv/player/Players.java | 21 ++++++++++++++++++- .../android/tv/player/danmaku/Loader.java | 12 +++++++++++ .../android/tv/player/danmaku/Parser.java | 12 ++++------- .../java/com/github/catvod/net/OkHttp.java | 9 ++++++++ 7 files changed, 51 insertions(+), 13 deletions(-) create mode 100644 app/src/main/java/com/fongmi/android/tv/player/danmaku/Loader.java diff --git a/app/src/main/java/com/fongmi/android/tv/api/Decoder.java b/app/src/main/java/com/fongmi/android/tv/api/Decoder.java index 5f9f19733..80bb31147 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/Decoder.java +++ b/app/src/main/java/com/fongmi/android/tv/api/Decoder.java @@ -22,10 +22,10 @@ public class Decoder { private static final Pattern JS_URI = Pattern.compile("\"(\\.|\\.\\.)/(.?|.+?)\\.js\\?(.?|.+?)\""); - public static String getJson(String url) throws Exception { + public static String getJson(String url, String tag) throws Exception { url = UrlUtil.convert(url); int size = HttpUrl.parse(url).querySize(); - Response res = OkHttp.newCall(url).execute(); + Response res = OkHttp.newCall(url, tag).execute(); HttpUrl httpUrl = res.request().url(); if (httpUrl.querySize() == size) url = httpUrl.toString(); return verify(url, res.body().string()); diff --git a/app/src/main/java/com/fongmi/android/tv/api/config/LiveConfig.java b/app/src/main/java/com/fongmi/android/tv/api/config/LiveConfig.java index e7388a0b9..a4de2cef2 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/config/LiveConfig.java +++ b/app/src/main/java/com/fongmi/android/tv/api/config/LiveConfig.java @@ -113,7 +113,8 @@ public class LiveConfig { private void loadConfig(Callback callback) { try { - parseConfig(Decoder.getJson(config.getUrl()), callback); + OkHttp.cancel("live"); + parseConfig(Decoder.getJson(config.getUrl(), "live"), callback); } catch (Throwable e) { if (TextUtils.isEmpty(config.getUrl())) App.post(() -> callback.error("")); else App.post(() -> callback.error(Notify.getError(R.string.error_config_get, e))); diff --git a/app/src/main/java/com/fongmi/android/tv/api/config/VodConfig.java b/app/src/main/java/com/fongmi/android/tv/api/config/VodConfig.java index 84901479a..5a8b21f8b 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/config/VodConfig.java +++ b/app/src/main/java/com/fongmi/android/tv/api/config/VodConfig.java @@ -111,7 +111,8 @@ public class VodConfig { private void loadConfig(Callback callback) { try { - checkJson(Json.parse(Decoder.getJson(config.getUrl())).getAsJsonObject(), callback); + OkHttp.cancel("vod"); + checkJson(Json.parse(Decoder.getJson(config.getUrl(), "vod")).getAsJsonObject(), callback); } catch (Throwable e) { if (TextUtils.isEmpty(config.getUrl())) App.post(() -> callback.error("")); else loadCache(callback, e); 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 884102f42..3e45b6f71 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 @@ -43,8 +43,10 @@ import com.fongmi.android.tv.bean.Track; import com.fongmi.android.tv.event.ActionEvent; import com.fongmi.android.tv.event.ErrorEvent; import com.fongmi.android.tv.event.PlayerEvent; +import com.fongmi.android.tv.impl.Callback; import com.fongmi.android.tv.impl.ParseCallback; import com.fongmi.android.tv.impl.SessionCallback; +import com.fongmi.android.tv.player.danmaku.Loader; import com.fongmi.android.tv.player.danmaku.Parser; import com.fongmi.android.tv.player.danmaku.Sync; import com.fongmi.android.tv.player.exo.ExoUtil; @@ -54,6 +56,7 @@ import com.fongmi.android.tv.utils.Notify; import com.fongmi.android.tv.utils.ResUtil; import com.fongmi.android.tv.utils.UrlUtil; import com.fongmi.android.tv.utils.Util; +import com.github.catvod.net.OkHttp; import com.github.catvod.utils.Path; import com.google.common.net.HttpHeaders; import com.orhanobut.logger.Logger; @@ -67,11 +70,14 @@ import java.util.Locale; import java.util.Map; import master.flame.danmaku.controller.DrawHandler; +import master.flame.danmaku.danmaku.loader.ILoader; import master.flame.danmaku.danmaku.model.BaseDanmaku; import master.flame.danmaku.danmaku.model.DanmakuTimer; import master.flame.danmaku.danmaku.model.IDisplayer; import master.flame.danmaku.danmaku.model.android.DanmakuContext; import master.flame.danmaku.ui.widget.DanmakuView; +import okhttp3.Call; +import okhttp3.Response; public class Players implements Player.Listener, ParseCallback, DrawHandler.Callback { @@ -488,7 +494,20 @@ public class Players implements Player.Listener, ParseCallback, DrawHandler.Call public void setDanmaku(String path) { danmaku.release(); - if (!TextUtils.isEmpty(path)) danmaku.prepare(new Parser(path), context); + OkHttp.cancel("danmaku"); + if (TextUtils.isEmpty(path)) return; + OkHttp.newCall(path, "danmaku").enqueue(new Callback() { + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) { + try { + ILoader loader = Loader.create(); + loader.load(response.body().byteStream()); + danmaku.prepare(new Parser().load(loader.getDataSource()), context); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); } public void setDanmakuSize(float size) { diff --git a/app/src/main/java/com/fongmi/android/tv/player/danmaku/Loader.java b/app/src/main/java/com/fongmi/android/tv/player/danmaku/Loader.java new file mode 100644 index 000000000..f93af080a --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/player/danmaku/Loader.java @@ -0,0 +1,12 @@ +package com.fongmi.android.tv.player.danmaku; + +import master.flame.danmaku.danmaku.loader.ILoader; +import master.flame.danmaku.danmaku.loader.android.BiliDanmakuLoader; +import master.flame.danmaku.danmaku.loader.android.DanmakuLoaderFactory; + +public class Loader extends DanmakuLoaderFactory { + + public static ILoader create() { + return BiliDanmakuLoader.instance(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/fongmi/android/tv/player/danmaku/Parser.java b/app/src/main/java/com/fongmi/android/tv/player/danmaku/Parser.java index 5d4478e14..69ac3836c 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/danmaku/Parser.java +++ b/app/src/main/java/com/fongmi/android/tv/player/danmaku/Parser.java @@ -1,8 +1,6 @@ package com.fongmi.android.tv.player.danmaku; import com.fongmi.android.tv.bean.DanmakuData; -import com.fongmi.android.tv.utils.UrlUtil; -import com.github.catvod.net.OkHttp; import java.io.BufferedReader; import java.io.InputStreamReader; @@ -15,24 +13,22 @@ import master.flame.danmaku.danmaku.model.BaseDanmaku; import master.flame.danmaku.danmaku.model.IDanmakus; import master.flame.danmaku.danmaku.model.android.Danmakus; import master.flame.danmaku.danmaku.parser.BaseDanmakuParser; +import master.flame.danmaku.danmaku.parser.android.AndroidFileSource; import master.flame.danmaku.danmaku.util.DanmakuUtils; public class Parser extends BaseDanmakuParser { private static final Pattern XML = Pattern.compile("p=\"([^\"]+)\"[^>]*>([^<]+)<"); private static final Pattern TXT = Pattern.compile("\\[(.*?)\\](.*)"); - private final String path; - - public Parser(String path) { - this.path = path; - } @Override public Danmakus parse() { String line; Pattern pattern = null; + if (mDataSource == null) return null; List items = new ArrayList<>(); - try (BufferedReader br = new BufferedReader(new InputStreamReader(OkHttp.newCall(UrlUtil.convert(path)).execute().body().byteStream()))) { + AndroidFileSource source = (AndroidFileSource) mDataSource; + try (BufferedReader br = new BufferedReader(new InputStreamReader(source.data()))) { while ((line = br.readLine()) != null) { if (pattern == null) pattern = line.startsWith("<") ? XML : TXT; Matcher matcher = pattern.matcher(line); diff --git a/catvod/src/main/java/com/github/catvod/net/OkHttp.java b/catvod/src/main/java/com/github/catvod/net/OkHttp.java index cac8a9f6a..72c0145ff 100644 --- a/catvod/src/main/java/com/github/catvod/net/OkHttp.java +++ b/catvod/src/main/java/com/github/catvod/net/OkHttp.java @@ -136,6 +136,10 @@ public class OkHttp { return client().newCall(new Request.Builder().url(url).build()); } + public static Call newCall(String url, String tag) { + return client().newCall(new Request.Builder().url(url).tag(tag).build()); + } + public static Call newCall(OkHttpClient client, String url) { return client.newCall(new Request.Builder().url(url).build()); } @@ -156,6 +160,11 @@ public class OkHttp { return client.newCall(new Request.Builder().url(url).post(body).build()); } + public static void cancel(String tag) { + for (Call call : client().dispatcher().queuedCalls()) if (tag.equals(call.request().tag())) call.cancel(); + for (Call call : client().dispatcher().runningCalls()) if (tag.equals(call.request().tag())) call.cancel(); + } + public static FormBody toBody(ArrayMap params) { FormBody.Builder body = new FormBody.Builder(); for (Map.Entry entry : params.entrySet()) body.add(entry.getKey(), entry.getValue());