diff --git a/app/src/main/java/com/fongmi/android/tv/api/Decoder.java b/app/src/main/java/com/fongmi/android/tv/api/Decoder.java index 533ef7a1a..9a101df54 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/Decoder.java +++ b/app/src/main/java/com/fongmi/android/tv/api/Decoder.java @@ -69,11 +69,11 @@ public class Decoder { SecretKeySpec spec = new SecretKeySpec(padEnd(key).getBytes(), "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, spec); - return new String(cipher.doFinal(decodeHex(data)), StandardCharsets.UTF_8); + return new String(cipher.doFinal(Util.hex2byte(data)), StandardCharsets.UTF_8); } private static String cbc(String data) throws Exception { - String decode = new String(decodeHex(data)).toLowerCase(); + String decode = new String(Util.hex2byte(data)).toLowerCase(); String key = padEnd(decode.substring(decode.indexOf("$#") + 2, decode.indexOf("#$"))); String iv = padEnd(decode.substring(decode.length() - 13)); SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES"); @@ -81,7 +81,7 @@ public class Decoder { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec); data = data.substring(data.indexOf("2324") + 4, data.length() - 26); - byte[] decryptData = cipher.doFinal(decodeHex(data)); + byte[] decryptData = cipher.doFinal(Util.hex2byte(data)); return new String(decryptData, StandardCharsets.UTF_8); } @@ -99,10 +99,4 @@ public class Decoder { private static String padEnd(String key) { return key + "0000000000000000".substring(key.length()); } - - private static byte[] decodeHex(String s) { - byte[] bytes = new byte[s.length() / 2]; - for (int i = 0; i < bytes.length; i++) bytes[i] = Integer.valueOf(s.substring(i * 2, i * 2 + 2), 16).byteValue(); - return bytes; - } } diff --git a/app/src/main/java/com/fongmi/android/tv/api/LiveParser.java b/app/src/main/java/com/fongmi/android/tv/api/LiveParser.java index 8f609466f..9b6a16e67 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/LiveParser.java +++ b/app/src/main/java/com/fongmi/android/tv/api/LiveParser.java @@ -59,15 +59,16 @@ public class LiveParser { Setting setting = Setting.create(); Channel channel = Channel.create(""); for (String line : text.split("\n")) { - setting.check(line); if (Thread.interrupted()) break; 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)); - setting.copy(channel).clear(); } else if (line.contains("://")) { + setting.copy(channel).clear(); channel.getUrls().add(line); + } else { + setting.check(line); } } } diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Drm.java b/app/src/main/java/com/fongmi/android/tv/bean/Drm.java index 93d2c631a..89853e262 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Drm.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Drm.java @@ -31,6 +31,10 @@ public class Drm { return TextUtils.isEmpty(key) ? "" : key; } + public void setKey(String key) { + this.key = key; + } + private String getType() { return TextUtils.isEmpty(type) ? "" : type; } @@ -43,9 +47,21 @@ public class Drm { private String getUri() { if (getKey().startsWith("http")) return getKey(); + if (!getKey().startsWith("{") && getKey().contains(":")) convert(); return Server.get().getAddress("license/") + Util.base64(getKey()); } + private void convert() { + String[] split = getKey().split(":"); + String kid = getBase64(split[0]); + String key = getBase64(split[1]); + setKey(String.format("{ \"keys\":[ { \"kty\":\"oct\", \"k\":\"%s\", \"kid\":\"%s\" } ], \"type\":\"temporary\" }", key, kid)); + } + + private String getBase64(String s) { + return Util.base64(Util.hex2byte(s)).replace("=", ""); + } + public MediaItem.DrmConfiguration get() { return new MediaItem.DrmConfiguration.Builder(getUUID()).setLicenseUri(getUri()).build(); } diff --git a/catvod/src/main/java/com/github/catvod/utils/Util.java b/catvod/src/main/java/com/github/catvod/utils/Util.java index c619f3d9e..46f6d5591 100644 --- a/catvod/src/main/java/com/github/catvod/utils/Util.java +++ b/catvod/src/main/java/com/github/catvod/utils/Util.java @@ -24,8 +24,8 @@ public class Util { public static final String CHROME = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36"; - public static String base64(String ext) { - return base64(ext.getBytes()); + public static String base64(String s) { + return base64(s.getBytes()); } public static String base64(byte[] bytes) { @@ -36,6 +36,12 @@ public class Util { return "Basic " + base64(uri.getUserInfo()); } + public static byte[] hex2byte(String s) { + byte[] bytes = new byte[s.length() / 2]; + for (int i = 0; i < bytes.length; i++) bytes[i] = Integer.valueOf(s.substring(i * 2, i * 2 + 2), 16).byteValue(); + return bytes; + } + public static boolean equals(String name, String md5) { return md5(Path.jar(name)).equalsIgnoreCase(md5); }