From baf01ddc869bd6c1c503ea69505b2cbdd2ce701b Mon Sep 17 00:00:00 2001 From: FongMi Date: Mon, 24 Feb 2025 11:22:02 +0800 Subject: [PATCH] Support multiple danmaku --- .../android/tv/ui/activity/VideoActivity.java | 9 +++--- .../com/fongmi/android/tv/bean/Danmaku.java | 32 ++++++++++++++++++- .../com/fongmi/android/tv/bean/Result.java | 11 ++++--- .../android/tv/gson/DanmakuAdapter.java | 20 ++++++++++++ .../android/tv/player/danmaku/Parser.java | 2 +- .../android/tv/ui/activity/VideoActivity.java | 9 +++--- .../com/github/catvod/crawler/Spider.java | 8 ----- 7 files changed, 69 insertions(+), 22 deletions(-) create mode 100644 app/src/main/java/com/fongmi/android/tv/gson/DanmakuAdapter.java diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index d46f511d3..6481feb1a 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -38,6 +38,7 @@ import com.fongmi.android.tv.Constant; import com.fongmi.android.tv.R; import com.fongmi.android.tv.Setting; import com.fongmi.android.tv.api.config.VodConfig; +import com.fongmi.android.tv.bean.Danmaku; import com.fongmi.android.tv.bean.Episode; import com.fongmi.android.tv.bean.Flag; import com.fongmi.android.tv.bean.History; @@ -551,10 +552,10 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List mQualityAdapter.addAll(result); } - private void checkDanmaku(String url) { + private void checkDanmaku(List items) { mBinding.danmaku.release(); - mBinding.danmaku.setVisibility(url.isEmpty() ? View.GONE : View.VISIBLE); - if (!url.isEmpty()) App.execute(() -> mBinding.danmaku.prepare(new Parser(url), mDanmakuContext)); + mBinding.danmaku.setVisibility(items.isEmpty() ? View.GONE : View.VISIBLE); + if (!items.isEmpty()) App.execute(() -> mBinding.danmaku.prepare(new Parser(items.get(0).getUrl()), mDanmakuContext)); } private void setFlagActivated(Flag item) { @@ -1079,7 +1080,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List if (isRedirect()) return; if (event.getType() == RefreshEvent.Type.DETAIL) getDetail(); else if (event.getType() == RefreshEvent.Type.PLAYER) onRefresh(); - else if (event.getType() == RefreshEvent.Type.DANMAKU) checkDanmaku(event.getPath()); + else if (event.getType() == RefreshEvent.Type.DANMAKU) checkDanmaku(Danmaku.from(event.getPath())); else if (event.getType() == RefreshEvent.Type.SUBTITLE) mPlayers.setSub(Sub.from(event.getPath())); } diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Danmaku.java b/app/src/main/java/com/fongmi/android/tv/bean/Danmaku.java index c52ad1374..d4b89b4e7 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Danmaku.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Danmaku.java @@ -2,6 +2,8 @@ package com.fongmi.android.tv.bean; import android.text.TextUtils; +import com.google.gson.annotations.SerializedName; + import org.simpleframework.xml.Attribute; import org.simpleframework.xml.ElementList; import org.simpleframework.xml.Root; @@ -22,7 +24,19 @@ public class Danmaku { @ElementList(entry = "d", required = false, inline = true) private List data; - public static Danmaku objectFrom(InputStream is) { + @SerializedName("name") + private String name; + @SerializedName("url") + private String url; + + public static List from(String path) { + Danmaku danmaku = new Danmaku(); + danmaku.setName(path); + danmaku.setUrl(path); + return List.of(danmaku); + } + + public static Danmaku fromXml(InputStream is) { try { return new Persister().read(Danmaku.class, is); } catch (Exception e) { @@ -50,6 +64,22 @@ public class Danmaku { return data = data == null ? new ArrayList<>() : data; } + public String getUrl() { + return TextUtils.isEmpty(url) ? "" : url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getName() { + return TextUtils.isEmpty(name) ? getUrl() : name; + } + + public void setName(String name) { + this.name = name; + } + public static class Data { @Attribute(name = "p", required = false) 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 1c7039348..be74e6371 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 @@ -8,6 +8,7 @@ import androidx.annotation.NonNull; import com.fongmi.android.tv.App; import com.fongmi.android.tv.Setting; +import com.fongmi.android.tv.gson.DanmakuAdapter; import com.fongmi.android.tv.gson.FilterAdapter; import com.fongmi.android.tv.gson.MsgAdapter; import com.fongmi.android.tv.gson.UrlAdapter; @@ -55,6 +56,10 @@ public class Result implements Parcelable { @JsonAdapter(MsgAdapter.class) private String msg; + @SerializedName("danmaku") + @JsonAdapter(DanmakuAdapter.class) + private List danmaku; + @SerializedName("subs") private List subs; @SerializedName("header") @@ -67,8 +72,6 @@ public class Result implements Parcelable { private String flag; @SerializedName("desc") private String desc; - @SerializedName("danmaku") - private String danmaku; @SerializedName("format") private String format; @SerializedName("click") @@ -231,8 +234,8 @@ public class Result implements Parcelable { return TextUtils.isEmpty(desc) ? "" : desc; } - public String getDanmaku() { - return !Setting.isDanmakuLoad() || TextUtils.isEmpty(danmaku) ? "" : danmaku; + public List getDanmaku() { + return !Setting.isDanmakuLoad() || danmaku == null ? new ArrayList<>() : danmaku; } public String getFormat() { diff --git a/app/src/main/java/com/fongmi/android/tv/gson/DanmakuAdapter.java b/app/src/main/java/com/fongmi/android/tv/gson/DanmakuAdapter.java new file mode 100644 index 000000000..67c581e03 --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/gson/DanmakuAdapter.java @@ -0,0 +1,20 @@ +package com.fongmi.android.tv.gson; + +import com.fongmi.android.tv.App; +import com.fongmi.android.tv.bean.Danmaku; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; + +import java.lang.reflect.Type; +import java.util.List; + +public class DanmakuAdapter implements JsonDeserializer> { + + @Override + public List deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + if (json.isJsonPrimitive()) return Danmaku.from(json.getAsString()); + return App.gson().fromJson(json, typeOfT); + } +} 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 5fa77a977..772e5b031 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 @@ -34,7 +34,7 @@ public class Parser extends BaseDanmakuParser { private void fetch(String path) { try { - danmaku = Danmaku.objectFrom(OkHttp.newCall(UrlUtil.convert(path)).execute().body().byteStream()); + danmaku = Danmaku.fromXml(OkHttp.newCall(UrlUtil.convert(path)).execute().body().byteStream()); } catch (IOException e) { danmaku = new Danmaku(); } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index b41d5c0cf..c515be124 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -42,6 +42,7 @@ import com.fongmi.android.tv.R; import com.fongmi.android.tv.Setting; import com.fongmi.android.tv.api.config.VodConfig; import com.fongmi.android.tv.bean.CastVideo; +import com.fongmi.android.tv.bean.Danmaku; import com.fongmi.android.tv.bean.Episode; import com.fongmi.android.tv.bean.Flag; import com.fongmi.android.tv.bean.History; @@ -557,10 +558,10 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo mQualityAdapter.addAll(result); } - private void checkDanmaku(String url) { + private void checkDanmaku(List items) { mBinding.danmaku.release(); - mBinding.danmaku.setVisibility(url.isEmpty() ? View.GONE : View.VISIBLE); - if (!url.isEmpty()) App.execute(() -> mBinding.danmaku.prepare(new Parser(url), mDanmakuContext)); + mBinding.danmaku.setVisibility(items.isEmpty() ? View.GONE : View.VISIBLE); + if (!items.isEmpty()) App.execute(() -> mBinding.danmaku.prepare(new Parser(items.get(0).getUrl()), mDanmakuContext)); } @Override @@ -1119,7 +1120,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo if (isRedirect()) return; if (event.getType() == RefreshEvent.Type.DETAIL) getDetail(); else if (event.getType() == RefreshEvent.Type.PLAYER) onRefresh(); - else if (event.getType() == RefreshEvent.Type.DANMAKU) checkDanmaku(event.getPath()); + else if (event.getType() == RefreshEvent.Type.DANMAKU) checkDanmaku(Danmaku.from(event.getPath())); else if (event.getType() == RefreshEvent.Type.SUBTITLE) mPlayers.setSub(Sub.from(event.getPath())); } diff --git a/catvod/src/main/java/com/github/catvod/crawler/Spider.java b/catvod/src/main/java/com/github/catvod/crawler/Spider.java index f93bfc094..8b8e39fe4 100644 --- a/catvod/src/main/java/com/github/catvod/crawler/Spider.java +++ b/catvod/src/main/java/com/github/catvod/crawler/Spider.java @@ -44,14 +44,6 @@ public abstract class Spider { return ""; } - public String searchDanmaku(String name) throws Exception { - return ""; - } - - public String searchSubtitle(String name) throws Exception { - return ""; - } - public String playerContent(String flag, String id, List vipFlags) throws Exception { return ""; }