okjack
FongMi 2 years ago
parent ec2ea9b5f8
commit dd30a59835
  1. 1
      app/src/leanback/AndroidManifest.xml
  2. 65
      app/src/main/java/com/fongmi/android/tv/api/LiveParser.java
  3. 4
      app/src/main/java/com/fongmi/android/tv/bean/Parse.java
  4. 4
      app/src/main/java/com/fongmi/android/tv/player/ParseJob.java
  5. 2
      app/src/main/java/com/fongmi/android/tv/player/extractor/JianPian.java
  6. 2
      app/src/main/java/com/fongmi/android/tv/utils/Sniffer.java
  7. 1
      app/src/mobile/AndroidManifest.xml

@ -77,6 +77,7 @@
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="ftp" />
<data android:scheme="ed2k" />
<data android:scheme="magnet" />
<data android:scheme="thunder" />

@ -7,9 +7,11 @@ import com.fongmi.android.tv.bean.Channel;
import com.fongmi.android.tv.bean.Drm;
import com.fongmi.android.tv.bean.Group;
import com.fongmi.android.tv.bean.Live;
import com.fongmi.android.tv.player.Players;
import com.fongmi.android.tv.utils.UrlUtil;
import com.github.catvod.net.OkHttp;
import com.github.catvod.utils.Path;
import com.github.catvod.utils.Util;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@ -60,15 +62,17 @@ public class LiveParser {
Channel channel = Channel.create("");
for (String line : text.split("\n")) {
if (Thread.interrupted()) break;
if (line.startsWith("#EXTINF:")) {
if (setting.find(line)) {
setting.check(line);
} else if (line.startsWith("#EXTINF:")) {
Group group = live.find(Group.create(extract(line, GROUP)));
channel = group.find(Channel.create(extract(line, NAME)));
channel.setLogo(extract(line, LOGO));
} else if (line.contains("://")) {
} else if (!line.startsWith("#") && line.contains("://")) {
String[] split = line.split("\\|");
for (String s : split) setting.check(s);
channel.getUrls().add(split[0]);
setting.copy(channel).clear();
channel.getUrls().add(line);
} else {
setting.check(line);
}
}
}
@ -125,17 +129,24 @@ public class LiveParser {
return new Setting();
}
public boolean find(String line) {
return line.startsWith("ua") || line.startsWith("parse") || line.startsWith("click") || line.startsWith("player") || line.startsWith("referer") || line.startsWith("#EXTVLCOPT:") || line.startsWith("#KODIPROP:");
}
public void check(String line) {
if (line.startsWith("ua")) ua(line);
if (line.startsWith("parse")) parse(line);
if (line.startsWith("click")) click(line);
if (line.startsWith("player")) player(line);
if (line.startsWith("referer")) referer(line);
if (line.startsWith("#EXTVLCOPT:http-user-agent")) ua(line);
if (line.startsWith("#EXTVLCOPT:http-referer")) referer(line);
if (line.startsWith("#KODIPROP:inputstream.adaptive.license_key")) key(line);
if (line.startsWith("#KODIPROP:inputstream.adaptive.license_type")) type(line);
if (line.contains("#genre#")) clear();
else if (line.startsWith("ua")) ua(line);
else if (line.startsWith("parse")) parse(line);
else if (line.startsWith("click")) click(line);
else if (line.startsWith("player")) player(line);
else if (line.startsWith("user-agent")) ua(line);
else if (line.startsWith("User-Agent")) ua(line);
else if (line.startsWith("referer")) referer(line);
else if (line.startsWith("Referer")) referer(line);
else if (line.startsWith("#EXTVLCOPT:http-user-agent")) ua(line);
else if (line.startsWith("#EXTVLCOPT:http-referer")) referer(line);
else if (line.startsWith("#KODIPROP:inputstream.adaptive.license_key")) key(line);
else if (line.startsWith("#KODIPROP:inputstream.adaptive.license_type")) type(line);
}
public Setting copy(Channel channel) {
@ -150,7 +161,7 @@ public class LiveParser {
private void ua(String line) {
try {
ua = line.split("=")[1].trim();
ua = line.split("ua=")[1].trim().replace("\"", "");
} catch (Exception e) {
ua = null;
}
@ -158,7 +169,7 @@ public class LiveParser {
private void referer(String line) {
try {
referer = line.split("=")[1].trim();
referer = line.split("referer=")[1].trim().replace("\"", "");
} catch (Exception e) {
referer = null;
}
@ -166,7 +177,7 @@ public class LiveParser {
private void parse(String line) {
try {
parse = Integer.parseInt(line.split("=")[1].trim());
parse = Integer.parseInt(line.split("parse=")[1].trim());
} catch (Exception e) {
parse = null;
}
@ -174,7 +185,7 @@ public class LiveParser {
private void click(String line) {
try {
click = line.split("=")[1].trim();
click = line.split("click=")[1].trim();
} catch (Exception e) {
click = null;
}
@ -182,7 +193,7 @@ public class LiveParser {
private void player(String line) {
try {
player = Integer.parseInt(line.split("=")[1].trim());
player = Integer.parseInt(line.split("player=")[1].trim());
} catch (Exception e) {
player = null;
}
@ -190,20 +201,32 @@ public class LiveParser {
private void key(String line) {
try {
key = line.split("=")[1].trim();
key = line.split("license_key=")[1].trim();
if (!key.startsWith("http") && !key.startsWith("{") && key.contains(":")) convert();
} catch (Exception e) {
key = null;
} finally {
player = Players.EXO;
}
}
private void type(String line) {
try {
type = line.split("=")[1].trim();
type = line.split("license_type=")[1].trim();
} catch (Exception e) {
type = null;
} finally {
player = Players.EXO;
}
}
private void convert() {
String[] split = key.split(":");
String k = Util.base64(Util.hex2byte(split[1])).replace("=", "");
String kid = Util.base64(Util.hex2byte(split[0])).replace("=", "");
key = String.format("{ \"keys\":[ { \"kty\":\"oct\", \"k\":\"%s\", \"kid\":\"%s\" } ], \"type\":\"temporary\" }", k, kid);
}
private void clear() {
ua = null;
key = null;

@ -112,6 +112,10 @@ public class Parse {
if (getExt().getHeader() == null) getExt().setHeader(header);
}
public boolean isEmpty() {
return getType() == 0 && getUrl().isEmpty();
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;

@ -55,7 +55,7 @@ public class ParseJob implements ParseCallback {
if (useParse) parse = ApiConfig.get().getParse();
if (result.getPlayUrl().startsWith("json:")) parse = Parse.get(1, result.getPlayUrl().substring(5));
if (result.getPlayUrl().startsWith("parse:")) parse = ApiConfig.get().getParse(result.getPlayUrl().substring(6));
if (parse == null) parse = Parse.get(0, result.getPlayUrl());
if (parse.isEmpty()) parse.setUrl(result.getPlayUrl());
parse.setHeader(result.getHeader());
parse.setClick(getClick(result));
}
@ -99,7 +99,7 @@ public class ParseJob implements ParseCallback {
case 3: //Json聚合
jsonMix(webUrl, flag);
break;
case 4: //上帝模式
case 4: //超級解析
godParse(webUrl, flag);
break;
}

@ -15,7 +15,7 @@ public class JianPian implements Source.Extractor {
@Override
public boolean match(String scheme, String host) {
return scheme.equals("tvbox-xg") || scheme.equals("jianpian");
return scheme.equals("tvbox-xg") || scheme.equals("jianpian") || scheme.equals("ftp");
}
private void init() {

@ -19,7 +19,7 @@ import java.util.regex.Pattern;
public class Sniffer {
public static final Pattern CLICKER = Pattern.compile("\\[a=cr:(\\{.*?\\})\\/](.*?)\\[\\/a]");
public static final Pattern AI_PUSH = Pattern.compile("(http|https|rtmp|rtsp|smb|thunder|magnet|ed2k|mitv|tvbox-xg|jianpian|video):[^\\s]+", Pattern.MULTILINE);
public static final Pattern AI_PUSH = Pattern.compile("(http|https|rtmp|rtsp|smb|ftp|thunder|magnet|ed2k|mitv|tvbox-xg|jianpian|video):[^\\s]+", Pattern.MULTILINE);
public static final Pattern SNIFFER = Pattern.compile("http((?!http).){12,}?\\.(m3u8|mp4|mkv|flv|mp3|m4a|aac)\\?.*|http((?!http).){12,}\\.(m3u8|mp4|mkv|flv|mp3|m4a|aac)|http((?!http).)*?video/tos*");
public static final List<String> THUNDER = Arrays.asList("thunder", "magnet", "ed2k");

@ -61,6 +61,7 @@
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="ftp" />
<data android:scheme="ed2k" />
<data android:scheme="magnet" />
<data android:scheme="thunder" />

Loading…
Cancel
Save