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 a237e15c1..e6c4d8d40 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 @@ -8,8 +8,13 @@ import org.simpleframework.xml.Root; import org.simpleframework.xml.Text; import org.simpleframework.xml.core.Persister; -import java.util.Collections; +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.ArrayList; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; @Root(name = "i", strict = false) public class Danmaku { @@ -17,17 +22,31 @@ public class Danmaku { @ElementList(entry = "d", required = false, inline = true) private List data; - public static Danmaku fromXml(String str) { + public static Danmaku objectFrom(InputStream is) { try { - return new Persister().read(Danmaku.class, str); + return new Persister().read(Danmaku.class, is); } catch (Exception e) { - e.printStackTrace(); - return new Danmaku(); + return fromText(is); + } + } + + public static Danmaku fromText(InputStream is) { + Danmaku danmaku = new Danmaku(); + Pattern pattern = Pattern.compile("\\[(.*?)\\](.*)"); + try (BufferedReader br = new BufferedReader(new InputStreamReader(is))) { + String line; + while ((line = br.readLine()) != null) { + Matcher matcher = pattern.matcher(line); + if (matcher.matches() && matcher.groupCount() == 2) danmaku.getData().add(new Data(matcher)); + } + return danmaku; + } catch (Exception ignored) { + return danmaku; } } public List getData() { - return data == null ? Collections.emptyList() : data; + return data = data == null ? new ArrayList<>() : data; } public static class Data { @@ -38,6 +57,16 @@ public class Danmaku { @Text(required = false) public String text; + public Data(Matcher matcher) { + this.param = matcher.group(1); + this.text = matcher.group(2); + } + + public Data(String param, String text) { + this.param = param; + this.text = text; + } + public String getParam() { return TextUtils.isEmpty(param) ? "" : param; } 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 08f6bdd23..d0d29c6e3 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 @@ -6,6 +6,7 @@ import com.fongmi.android.tv.bean.Danmaku; import com.fongmi.android.tv.utils.UrlUtil; import com.github.catvod.net.OkHttp; +import java.io.IOException; import java.util.HashMap; import java.util.Map; @@ -18,17 +19,25 @@ import master.flame.danmaku.danmaku.util.DanmakuUtils; public class Parser extends BaseDanmakuParser { private final Map charMap; - private final Danmaku danmaku; private BaseDanmaku item; + private Danmaku danmaku; private int index; public Parser(String path) { - danmaku = Danmaku.fromXml(OkHttp.string(UrlUtil.convert(path))); charMap = new HashMap<>(); charMap.put("&", "&"); charMap.put(""", "\""); charMap.put(">", ">"); charMap.put("<", "<"); + fetch(path); + } + + private void fetch(String path) { + try { + danmaku = Danmaku.objectFrom(OkHttp.newCall(UrlUtil.convert(path)).execute().body().byteStream()); + } catch (IOException e) { + danmaku = new Danmaku(); + } } @Override