Support parse type 2 and 3

pull/102/head
FongMi 4 years ago
parent 871aff2a61
commit d82e2eaaf9
  1. 15
      app/src/main/java/com/fongmi/android/tv/bean/Parse.java
  2. 49
      app/src/main/java/com/fongmi/android/tv/bean/ParseResult.java
  3. 21
      app/src/main/java/com/fongmi/android/tv/bean/Result.java
  4. 2
      app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java
  5. 71
      app/src/main/java/com/fongmi/android/tv/player/ParseTask.java
  6. 2
      app/src/main/java/com/fongmi/android/tv/player/Players.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);
}
}
}

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

@ -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<LinkedHashMap<String, List<Filter>>>() {}.getType();
Type type = new TypeToken<LinkedHashMap<String, List<Filter>>>() {
}.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() {

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

@ -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<String, String> 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<String, String> 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<String, String> 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<String, HashMap<String, String>> jxs = new LinkedHashMap<>();
for (Parse item : ApiConfig.get().getParses()) {
HashMap<String, String> 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<String, String> headers, String url) {
handler.post(() -> {
if (callback != null) callback.onParseSuccess(headers, url);

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

Loading…
Cancel
Save