Optimize danmaku load

pull/589/head
FongMi 10 months ago
parent da069e9d21
commit 9bc1809099
  1. 4
      app/src/main/java/com/fongmi/android/tv/api/Decoder.java
  2. 3
      app/src/main/java/com/fongmi/android/tv/api/config/LiveConfig.java
  3. 3
      app/src/main/java/com/fongmi/android/tv/api/config/VodConfig.java
  4. 21
      app/src/main/java/com/fongmi/android/tv/player/Players.java
  5. 12
      app/src/main/java/com/fongmi/android/tv/player/danmaku/Loader.java
  6. 12
      app/src/main/java/com/fongmi/android/tv/player/danmaku/Parser.java
  7. 9
      catvod/src/main/java/com/github/catvod/net/OkHttp.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());

@ -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)));

@ -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);

@ -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) {

@ -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();
}
}

@ -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<DanmakuData> 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);

@ -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<String, String> params) {
FormBody.Builder body = new FormBody.Builder();
for (Map.Entry<String, String> entry : params.entrySet()) body.add(entry.getKey(), entry.getValue());

Loading…
Cancel
Save