Support multiple danmaku

pull/589/head
FongMi 1 year ago
parent 9d48cc2189
commit baf01ddc86
  1. 9
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java
  2. 32
      app/src/main/java/com/fongmi/android/tv/bean/Danmaku.java
  3. 11
      app/src/main/java/com/fongmi/android/tv/bean/Result.java
  4. 20
      app/src/main/java/com/fongmi/android/tv/gson/DanmakuAdapter.java
  5. 2
      app/src/main/java/com/fongmi/android/tv/player/danmaku/Parser.java
  6. 9
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java
  7. 8
      catvod/src/main/java/com/github/catvod/crawler/Spider.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<Danmaku> 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()));
}

@ -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> data;
public static Danmaku objectFrom(InputStream is) {
@SerializedName("name")
private String name;
@SerializedName("url")
private String url;
public static List<Danmaku> 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)

@ -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> danmaku;
@SerializedName("subs")
private List<Sub> 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<Danmaku> getDanmaku() {
return !Setting.isDanmakuLoad() || danmaku == null ? new ArrayList<>() : danmaku;
}
public String getFormat() {

@ -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<List<Danmaku>> {
@Override
public List<Danmaku> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
if (json.isJsonPrimitive()) return Danmaku.from(json.getAsString());
return App.gson().fromJson(json, typeOfT);
}
}

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

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

@ -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<String> vipFlags) throws Exception {
return "";
}

Loading…
Cancel
Save