From d82e2eaaf9a1246a04e27f77e251130d4e678ed6 Mon Sep 17 00:00:00 2001 From: FongMi Date: Wed, 17 Aug 2022 00:49:00 +0800 Subject: [PATCH] Support parse type 2 and 3 --- .../com/fongmi/android/tv/bean/Parse.java | 15 ++++ .../fongmi/android/tv/bean/ParseResult.java | 49 +++++++++++++ .../com/fongmi/android/tv/bean/Result.java | 21 +++--- .../android/tv/model/SiteViewModel.java | 2 +- .../fongmi/android/tv/player/ParseTask.java | 71 ++++++++++++++----- .../com/fongmi/android/tv/player/Players.java | 2 +- 6 files changed, 131 insertions(+), 29 deletions(-) create mode 100644 app/src/main/java/com/fongmi/android/tv/bean/ParseResult.java diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Parse.java b/app/src/main/java/com/fongmi/android/tv/bean/Parse.java index f95784feb..063acf97b 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Parse.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Parse.java @@ -1,6 +1,9 @@ package com.fongmi.android.tv.bean; import android.text.TextUtils; +import android.util.Base64; + +import androidx.annotation.NonNull; import com.google.gson.Gson; import com.google.gson.JsonElement; @@ -72,6 +75,12 @@ public class Parse { return getExt().getHeader(); } + public String mixUrl() { + int index = getUrl().indexOf("?"); + if (getExt() == null || index == -1) return getUrl(); + return getUrl().substring(0, index + 1) + "cat_ext=" + Base64.encodeToString(getExt().toString().getBytes(), Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP) + "&" + getUrl().substring(index + 1); + } + @Override public boolean equals(Object obj) { if (this == obj) return true; @@ -94,5 +103,11 @@ public class Parse { public JsonElement getHeader() { return header; } + + @NonNull + @Override + public String toString() { + return new Gson().toJson(this); + } } } diff --git a/app/src/main/java/com/fongmi/android/tv/bean/ParseResult.java b/app/src/main/java/com/fongmi/android/tv/bean/ParseResult.java new file mode 100644 index 000000000..07b65d516 --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/bean/ParseResult.java @@ -0,0 +1,49 @@ +package com.fongmi.android.tv.bean; + +import android.text.TextUtils; + +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.annotations.SerializedName; + +import org.json.JSONObject; + +public class ParseResult { + + @SerializedName("header") + private JsonElement header; + @SerializedName("jxFrom") + private String jxFrom; + @SerializedName("parse") + private Integer parse; + @SerializedName("url") + private String url; + + public static ParseResult objectFrom(JSONObject object) { + try { + return new Gson().fromJson(object.toString(), ParseResult.class); + } catch (Exception e) { + return new ParseResult(); + } + } + + public JsonElement getHeader() { + return header; + } + + public String getJxFrom() { + return TextUtils.isEmpty(jxFrom) ? "" : jxFrom; + } + + public Integer getParse() { + return parse == null ? 0 : parse; + } + + public String getUrl() { + return TextUtils.isEmpty(url) ? "" : url; + } + + public boolean hasHeader() { + return getHeader() != null; + } +} 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 b8c89f8f5..d4ec39538 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 @@ -49,18 +49,19 @@ public class Result { private String playUrl; @SerializedName("header") private String header; - @SerializedName("parse") - private String parse; @SerializedName("flag") private String flag; - @SerializedName("jx") - private String jx; @SerializedName("url") private String url; + @SerializedName("parse") + private Integer parse; + @SerializedName("jx") + private Integer jx; public static Result fromJson(String str) { try { - Type type = new TypeToken>>() {}.getType(); + Type type = new TypeToken>>() { + }.getType(); Gson gson = new GsonBuilder().registerTypeAdapter(type, new FiltersAdapter()).create(); Result result = gson.fromJson(str, Result.class); return result == null ? new Result() : result; @@ -115,11 +116,11 @@ public class Result { return TextUtils.isEmpty(header) ? "" : header; } - public String getParse() { - return TextUtils.isEmpty(parse) ? "1" : parse; + public Integer getParse() { + return parse == null ? 1 : parse; } - public void setParse(String parse) { + public void setParse(Integer parse) { this.parse = parse; } @@ -131,8 +132,8 @@ public class Result { this.flag = flag; } - public String getJx() { - return TextUtils.isEmpty(jx) ? "0" : jx; + public Integer getJx() { + return jx == null ? 0 : jx; } public String getUrl() { diff --git a/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java b/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java index 29c17ce91..9d9fe5c8e 100644 --- a/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java +++ b/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java @@ -141,7 +141,7 @@ public class SiteViewModel extends ViewModel { result.setUrl(id); result.setFlag(flag); result.setPlayUrl(site.getPlayerUrl()); - result.setParse(Utils.isVideoFormat(id) ? "0" : "1"); + result.setParse(Utils.isVideoFormat(id) ? 0 : 1); return result; } }); diff --git a/app/src/main/java/com/fongmi/android/tv/player/ParseTask.java b/app/src/main/java/com/fongmi/android/tv/player/ParseTask.java index c5228a7ae..b18d81f29 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/ParseTask.java +++ b/app/src/main/java/com/fongmi/android/tv/player/ParseTask.java @@ -5,6 +5,7 @@ import android.os.Looper; import com.fongmi.android.tv.api.ApiConfig; import com.fongmi.android.tv.bean.Parse; +import com.fongmi.android.tv.bean.ParseResult; import com.fongmi.android.tv.bean.Result; import com.fongmi.android.tv.net.OKHttp; import com.fongmi.android.tv.utils.Json; @@ -12,6 +13,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -36,51 +38,86 @@ public class ParseTask { this.callback = callback; } + private boolean useParse(Result result) { + return (result.getPlayUrl().isEmpty() && ApiConfig.get().getFlags().contains(result.getFlag())) || result.getJx() == 1; + } + public void run(Result result) { - boolean useParse = (result.getPlayUrl().isEmpty() && ApiConfig.get().getFlags().contains(result.getFlag())) || result.getJx().equals("1"); - setParse(result.getPlayUrl() + result.getUrl(), useParse); - executor.submit(this::doInBackground); + setParse(result.getPlayUrl(), useParse(result)); + executor.submit(() -> doInBackground(result.getUrl(), result.getFlag())); } private void setParse(String url, boolean useParse) { if (useParse) parse = ApiConfig.get().getParse(); - if (url.startsWith("json:")) parse = Parse.get(1, url.substring(5)); - if (url.startsWith("parse:")) parse = ApiConfig.get().getParse(url.substring(6)); + else if (url.startsWith("json:")) parse = Parse.get(1, url.substring(5)); + else if (url.startsWith("parse:")) parse = ApiConfig.get().getParse(url.substring(6)); if (parse == null) parse = Parse.get(0, url); } - private void doInBackground() { + private void doInBackground(String webUrl, String flag) { switch (parse.getType()) { case 0: //嗅探 - handler.post(() -> Players.get().web().start(parse.getUrl(), callback)); + handler.post(() -> Players.get().web().start(parse.getUrl() + webUrl, callback)); break; case 1: //Json - jsonParse(); + jsonParse(webUrl); break; case 2: //Json 擴展 - + jsonExtend(webUrl); break; case 3: //聚合 - + jsonMix(webUrl, flag); break; } } - private void jsonParse() { + private void jsonParse(String webUrl) { try { - Headers headers = new Headers.Builder().build(); - if (parse.hasHeader()) headers = Headers.of(Json.toMap(parse.getHeader())); - Response response = OKHttp.newCall(parse.getUrl(), headers).execute(); + Headers reqHeader = new Headers.Builder().build(); + if (parse.hasHeader()) reqHeader = Headers.of(Json.toMap(parse.getHeader())); + Response response = OKHttp.newCall(parse.getUrl() + webUrl, reqHeader).execute(); JsonObject object = JsonParser.parseString(response.body().string()).getAsJsonObject(); - HashMap header = new HashMap<>(); - for (String key : object.keySet()) if (key.equalsIgnoreCase("user-agent") || key.equalsIgnoreCase("referer")) header.put(key, object.get(key).getAsString()); - onParseSuccess(header, object.get("url").getAsString()); + HashMap headers = new HashMap<>(); + for (String key : object.keySet()) if (key.equalsIgnoreCase("user-agent") || key.equalsIgnoreCase("referer")) headers.put(key, object.get(key).getAsString()); + onParseSuccess(headers, object.get("url").getAsString()); } catch (Exception e) { e.printStackTrace(); onParseError(); } } + private void jsonExtend(String webUrl) { + LinkedHashMap jxs = new LinkedHashMap<>(); + for (Parse item : ApiConfig.get().getParses()) if (item.getType() == 1) jxs.put(item.getName(), item.mixUrl()); + ParseResult result = ParseResult.objectFrom(ApiConfig.get().jsonExt(parse.getUrl(), jxs, webUrl)); + if (result.getUrl().isEmpty()) { + onParseError(); + } else if (result.getParse() == 1) { + handler.post(() -> Players.get().web().start(result.getUrl(), callback)); + } else { + onParseSuccess(result.hasHeader() ? Json.toMap(result.getHeader()) : new HashMap<>(), result.getUrl()); + } + } + + private void jsonMix(String webUrl, String flag) { + LinkedHashMap> jxs = new LinkedHashMap<>(); + for (Parse item : ApiConfig.get().getParses()) { + HashMap map = new HashMap<>(); + map.put("type", item.getType().toString()); + map.put("ext", item.getExt().toString()); + map.put("url", item.getUrl()); + jxs.put(item.getName(), map); + } + ParseResult result = ParseResult.objectFrom(ApiConfig.get().jsonExtMix(flag + "111", parse.getUrl(), parse.getName(), jxs, webUrl)); + if (result.getUrl().isEmpty()) { + onParseError(); + } else if (result.getParse() == 1) { + handler.post(() -> Players.get().web().start(result.getUrl(), callback)); + } else { + onParseSuccess(result.hasHeader() ? Json.toMap(result.getHeader()) : new HashMap<>(), result.getUrl()); + } + } + private void onParseSuccess(Map headers, String url) { handler.post(() -> { if (callback != null) callback.onParseSuccess(headers, url); 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 6e9d4eb29..cac88f764 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 @@ -106,7 +106,7 @@ public class Players implements Player.Listener, ParseTask.Callback { public void setMediaSource(Result result) { if (result.getUrl().isEmpty()) { PlayerEvent.error(R.string.error_play_load); - } else if (result.getParse().equals("1") || result.getJx().equals("1")) { + } else if (result.getParse() == 1 || result.getJx() == 1) { ParseTask.create(this).run(result); } else { setMediaSource(result.getHeaders(), result.getPlayUrl() + result.getUrl());