From f7d957d67ac4f06e272bdee08be29fa442ae4752 Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 4 Aug 2022 15:34:04 +0800 Subject: [PATCH] Support relative path --- .../com/fongmi/android/tv/api/ApiConfig.java | 31 +++++++++++-------- .../com/fongmi/android/tv/utils/Utils.java | 14 +++++++-- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java b/app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java index c07a93c20..4b9b8e2c5 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java +++ b/app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java @@ -2,7 +2,6 @@ package com.fongmi.android.tv.api; import android.os.Handler; import android.os.Looper; -import android.util.Patterns; import com.fongmi.android.tv.R; import com.fongmi.android.tv.bean.Live; @@ -13,6 +12,7 @@ import com.fongmi.android.tv.net.OKHttp; import com.fongmi.android.tv.utils.FileUtil; import com.fongmi.android.tv.utils.Json; import com.fongmi.android.tv.utils.Prefers; +import com.fongmi.android.tv.utils.Utils; import com.github.catvod.crawler.Spider; import com.google.gson.Gson; import com.google.gson.JsonElement; @@ -28,8 +28,6 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import okhttp3.Response; - public class ApiConfig { private List ads; @@ -72,8 +70,8 @@ public class ApiConfig { public void loadConfig(Callback callback) { new Thread(() -> { String url = Prefers.getUrl(); - if (url.startsWith("file://")) getFileConfig(url, callback); - else if (Patterns.WEB_URL.matcher(url).matches()) getWebConfig(url, callback); + if (url.startsWith("http")) getWebConfig(url, callback); + else if (url.startsWith("file")) getFileConfig(url, callback); else handler.post(() -> callback.error(0)); }).start(); } @@ -89,8 +87,7 @@ public class ApiConfig { private void getWebConfig(String url, Callback callback) { try { - Response response = OKHttp.newCall(url).execute(); - parseConfig(new Gson().fromJson(response.body().string(), JsonObject.class), callback); + parseConfig(new Gson().fromJson(OKHttp.newCall(url).execute().body().string(), JsonObject.class), callback); } catch (Exception e) { handler.post(() -> callback.error(R.string.error_config_get)); } @@ -111,7 +108,7 @@ public class ApiConfig { private void parseJson(JsonObject object) { for (JsonElement element : object.get("sites").getAsJsonArray()) { Site site = Site.objectFrom(element); - if (site.getExt().startsWith("file://")) site.setExt(FileUtil.read(site.getExt())); + site.setExt(parseExt(site.getExt())); if (site.getKey().equals(Prefers.getHome())) setHome(site); sites.add(site); } @@ -120,14 +117,22 @@ public class ApiConfig { ads.addAll(Json.safeList(object, "ads")); } + private String parseExt(String ext) { + if (ext.startsWith("http")) return ext; + else if (ext.startsWith("file")) return FileUtil.read(ext); + else if (ext.endsWith(".json")) return parseExt(Utils.convert(ext)); + return ext; + } + private void parseJar(String spider) throws Exception { if (spider.contains(";md5")) spider = spider.split(";md5")[0]; - if (spider.startsWith("file://")) { - loader.load(FileUtil.getLocal(spider)); - } else if (Patterns.WEB_URL.matcher(spider).matches()) { - Response response = OKHttp.newCall(spider).execute(); - FileUtil.write(FileUtil.getJar(), response.body().bytes()); + if (spider.startsWith("http")) { + FileUtil.write(FileUtil.getJar(), OKHttp.newCall(spider).execute().body().bytes()); loader.load(FileUtil.getJar()); + } else if (spider.startsWith("file")) { + loader.load(FileUtil.getLocal(spider)); + } else if (!spider.isEmpty()) { + parseJar(Utils.convert(spider)); } } diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Utils.java b/app/src/main/java/com/fongmi/android/tv/utils/Utils.java index 0507c7c7b..8c0233b88 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/Utils.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/Utils.java @@ -4,9 +4,11 @@ import android.app.Activity; import android.app.PictureInPictureParams; import android.content.Context; import android.content.pm.PackageManager; +import android.net.Uri; import android.net.wifi.WifiManager; import android.os.Build; import android.provider.Settings; +import android.text.TextUtils; import android.text.format.Formatter; import android.util.Rational; import android.view.View; @@ -18,7 +20,7 @@ import java.util.regex.Pattern; public class Utils { - private static final Pattern snifferMatch = Pattern.compile("http((?!http).){26,}?\\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg)\\?.*|http((?!http).){26,}\\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg)|http((?!http).){26,}?/m3u8\\?pt=m3u8.*|http((?!http).)*?default\\.ixigua\\.com/.*|http((?!http).)*?cdn-tos[^\\?]*|http((?!http).)*?/obj/tos[^\\?]*|http.*?/player/m3u8play\\.php\\?url=.*|http.*?/player/.*?[pP]lay\\.php\\?url=.*|http.*?/playlist/m3u8/\\?vid=.*|http.*?\\.php\\?type=m3u8&.*|http.*?/download.aspx\\?.*|http.*?/api/up_api.php\\?.*|https.*?\\.66yk\\.cn.*|http((?!http).)*?netease\\.com/file/.*"); + private static final Pattern SNIFFER = Pattern.compile("http((?!http).){26,}?\\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg)\\?.*|http((?!http).){26,}\\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg)|http((?!http).){26,}?/m3u8\\?pt=m3u8.*|http((?!http).)*?default\\.ixigua\\.com/.*|http((?!http).)*?cdn-tos[^\\?]*|http((?!http).)*?/obj/tos[^\\?]*|http.*?/player/m3u8play\\.php\\?url=.*|http.*?/player/.*?[pP]lay\\.php\\?url=.*|http.*?/playlist/m3u8/\\?vid=.*|http.*?\\.php\\?type=m3u8&.*|http.*?/download.aspx\\?.*|http.*?/api/up_api.php\\?.*|https.*?\\.66yk\\.cn.*|http((?!http).)*?netease\\.com/file/.*"); public static boolean hasPIP() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && App.get().getPackageManager().hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE); @@ -55,7 +57,15 @@ public class Utils { public static boolean isVideoFormat(String url) { if (url.contains("=http") || url.contains("=https") || url.contains("=https%3a%2f") || url.contains("=http%3a%2f")) return false; - if (snifferMatch.matcher(url).find()) return !url.contains("cdn-tos") || (!url.contains(".js") && !url.contains(".css")); + if (SNIFFER.matcher(url).find()) return !url.contains("cdn-tos") || (!url.contains(".js") && !url.contains(".css")); return false; } + + public static String convert(String text) { + if (TextUtils.isEmpty(text)) return ""; + if (text.startsWith(".")) text = text.substring(1); + if (text.startsWith("/")) text = text.substring(1); + Uri uri = Uri.parse(Prefers.getUrl()); + return uri.toString().replace(uri.getLastPathSegment(), text); + } }