|
|
|
|
@ -41,6 +41,8 @@ import java.util.HashMap; |
|
|
|
|
import java.util.LinkedHashMap; |
|
|
|
|
import java.util.List; |
|
|
|
|
import java.util.Map; |
|
|
|
|
import java.util.regex.Matcher; |
|
|
|
|
import java.util.regex.Pattern; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @author pj567 |
|
|
|
|
@ -88,9 +90,11 @@ public class ApiConfig { |
|
|
|
|
String content = json; |
|
|
|
|
try { |
|
|
|
|
if (AES.isJson(content)) return content; |
|
|
|
|
if(content.contains("**")){ |
|
|
|
|
String[] data = json.split("\\*\\*"); |
|
|
|
|
content = new String(Base64.decode(data[1], Base64.DEFAULT)); |
|
|
|
|
Pattern pattern = Pattern.compile("[A-Za-z0]{8}\\*\\*"); |
|
|
|
|
Matcher matcher = pattern.matcher(content); |
|
|
|
|
if(matcher.find()){ |
|
|
|
|
content=content.substring(content.indexOf(matcher.group()) + 10); |
|
|
|
|
content = new String(Base64.decode(content, Base64.DEFAULT)); |
|
|
|
|
} |
|
|
|
|
if (content.startsWith("2423")) { |
|
|
|
|
String data = content.substring(content.indexOf("2324") + 4, content.length() - 26); |
|
|
|
|
@ -322,15 +326,18 @@ public class ApiConfig { |
|
|
|
|
vipParseFlags = DefaultConfig.safeJsonStringList(infoJson, "flags"); |
|
|
|
|
// 解析地址
|
|
|
|
|
parseBeanList.clear(); |
|
|
|
|
for (JsonElement opt : infoJson.get("parses").getAsJsonArray()) { |
|
|
|
|
JsonObject obj = (JsonObject) opt; |
|
|
|
|
ParseBean pb = new ParseBean(); |
|
|
|
|
pb.setName(obj.get("name").getAsString().trim()); |
|
|
|
|
pb.setUrl(obj.get("url").getAsString().trim()); |
|
|
|
|
String ext = obj.has("ext") ? obj.get("ext").getAsJsonObject().toString() : ""; |
|
|
|
|
pb.setExt(ext); |
|
|
|
|
pb.setType(DefaultConfig.safeJsonInt(obj, "type", 0)); |
|
|
|
|
parseBeanList.add(pb); |
|
|
|
|
if(infoJson.has("parses")){ |
|
|
|
|
JsonArray parses = infoJson.get("parses").getAsJsonArray(); |
|
|
|
|
for (JsonElement opt : parses) { |
|
|
|
|
JsonObject obj = (JsonObject) opt; |
|
|
|
|
ParseBean pb = new ParseBean(); |
|
|
|
|
pb.setName(obj.get("name").getAsString().trim()); |
|
|
|
|
pb.setUrl(obj.get("url").getAsString().trim()); |
|
|
|
|
String ext = obj.has("ext") ? obj.get("ext").getAsJsonObject().toString() : ""; |
|
|
|
|
pb.setExt(ext); |
|
|
|
|
pb.setType(DefaultConfig.safeJsonInt(obj, "type", 0)); |
|
|
|
|
parseBeanList.add(pb); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// 获取默认解析
|
|
|
|
|
if (parseBeanList != null && parseBeanList.size() > 0) { |
|
|
|
|
@ -347,6 +354,11 @@ public class ApiConfig { |
|
|
|
|
liveChannelGroupList.clear(); //修复从后台切换重复加载频道列表
|
|
|
|
|
try { |
|
|
|
|
String lives = infoJson.get("lives").getAsJsonArray().toString(); |
|
|
|
|
// if(lives.indexOf("group")==-1){
|
|
|
|
|
// String defaultLiveTxt="[{\"group\":\"redirect\",\"channels\":[{\"name\":\"redirect\",\"urls\":[\"proxy://do=live&type=txt&ext=defaultLiveTxt\"]}]}]";
|
|
|
|
|
// JsonArray fengMilives = infoJson.get("lives").getAsJsonArray();
|
|
|
|
|
// lives=defaultLiveTxt.replace("defaultLiveTxt",fengMilives.get(0).getAsJsonObject().get("url").getAsString());
|
|
|
|
|
// }
|
|
|
|
|
int index = lives.indexOf("proxy://"); |
|
|
|
|
if (index != -1) { |
|
|
|
|
int endIndex = lives.lastIndexOf("\""); |
|
|
|
|
@ -369,12 +381,12 @@ public class ApiConfig { |
|
|
|
|
extUrlFix = Base64.encodeToString(extUrlFix.getBytes("UTF-8"), Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_WRAP); |
|
|
|
|
url = url.replace(extUrl, extUrlFix); |
|
|
|
|
} |
|
|
|
|
// System.out.println("url :"+url);
|
|
|
|
|
// System.out.println("urlLive :"+url);
|
|
|
|
|
LiveChannelGroup liveChannelGroup = new LiveChannelGroup(); |
|
|
|
|
liveChannelGroup.setGroupName(url); |
|
|
|
|
liveChannelGroupList.add(liveChannelGroup); |
|
|
|
|
} else { |
|
|
|
|
loadLives(infoJson.get("lives").getAsJsonArray()); |
|
|
|
|
if(lives.contains("group"))loadLives(infoJson.get("lives").getAsJsonArray()); |
|
|
|
|
} |
|
|
|
|
} catch (Throwable th) { |
|
|
|
|
th.printStackTrace(); |
|
|
|
|
@ -410,37 +422,41 @@ public class ApiConfig { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// 广告地址
|
|
|
|
|
for (JsonElement host : infoJson.getAsJsonArray("ads")) { |
|
|
|
|
AdBlocker.addAdHost(host.getAsString()); |
|
|
|
|
if(infoJson.has("ads")){ |
|
|
|
|
for (JsonElement host : infoJson.getAsJsonArray("ads")) { |
|
|
|
|
AdBlocker.addAdHost(host.getAsString()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// IJK解码配置
|
|
|
|
|
boolean foundOldSelect = false; |
|
|
|
|
String ijkCodec = Hawk.get(HawkConfig.IJK_CODEC, ""); |
|
|
|
|
ijkCodes = new ArrayList<>(); |
|
|
|
|
for (JsonElement opt : infoJson.get("ijk").getAsJsonArray()) { |
|
|
|
|
JsonObject obj = (JsonObject) opt; |
|
|
|
|
String name = obj.get("group").getAsString(); |
|
|
|
|
LinkedHashMap<String, String> baseOpt = new LinkedHashMap<>(); |
|
|
|
|
for (JsonElement cfg : obj.get("options").getAsJsonArray()) { |
|
|
|
|
JsonObject cObj = (JsonObject) cfg; |
|
|
|
|
String key = cObj.get("category").getAsString() + "|" + cObj.get("name").getAsString(); |
|
|
|
|
String val = cObj.get("value").getAsString(); |
|
|
|
|
baseOpt.put(key, val); |
|
|
|
|
if(infoJson.has("ijk")){ |
|
|
|
|
boolean foundOldSelect = false; |
|
|
|
|
String ijkCodec = Hawk.get(HawkConfig.IJK_CODEC, ""); |
|
|
|
|
for (JsonElement opt : infoJson.get("ijk").getAsJsonArray()) { |
|
|
|
|
JsonObject obj = (JsonObject) opt; |
|
|
|
|
String name = obj.get("group").getAsString(); |
|
|
|
|
LinkedHashMap<String, String> baseOpt = new LinkedHashMap<>(); |
|
|
|
|
for (JsonElement cfg : obj.get("options").getAsJsonArray()) { |
|
|
|
|
JsonObject cObj = (JsonObject) cfg; |
|
|
|
|
String key = cObj.get("category").getAsString() + "|" + cObj.get("name").getAsString(); |
|
|
|
|
String val = cObj.get("value").getAsString(); |
|
|
|
|
baseOpt.put(key, val); |
|
|
|
|
} |
|
|
|
|
IJKCode codec = new IJKCode(); |
|
|
|
|
codec.setName(name); |
|
|
|
|
codec.setOption(baseOpt); |
|
|
|
|
if (name.equals(ijkCodec) || TextUtils.isEmpty(ijkCodec)) { |
|
|
|
|
codec.selected(true); |
|
|
|
|
ijkCodec = name; |
|
|
|
|
foundOldSelect = true; |
|
|
|
|
} else { |
|
|
|
|
codec.selected(false); |
|
|
|
|
} |
|
|
|
|
ijkCodes.add(codec); |
|
|
|
|
} |
|
|
|
|
IJKCode codec = new IJKCode(); |
|
|
|
|
codec.setName(name); |
|
|
|
|
codec.setOption(baseOpt); |
|
|
|
|
if (name.equals(ijkCodec) || TextUtils.isEmpty(ijkCodec)) { |
|
|
|
|
codec.selected(true); |
|
|
|
|
ijkCodec = name; |
|
|
|
|
foundOldSelect = true; |
|
|
|
|
} else { |
|
|
|
|
codec.selected(false); |
|
|
|
|
if (!foundOldSelect && ijkCodes.size() > 0) { |
|
|
|
|
ijkCodes.get(0).selected(true); |
|
|
|
|
} |
|
|
|
|
ijkCodes.add(codec); |
|
|
|
|
} |
|
|
|
|
if (!foundOldSelect && ijkCodes.size() > 0) { |
|
|
|
|
ijkCodes.get(0).selected(true); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|