From bc964ebe6f4665e1cb0097fcbe53a99ff4ee2198 Mon Sep 17 00:00:00 2001 From: FongMi Date: Fri, 22 Dec 2023 10:40:48 +0800 Subject: [PATCH] Support assets:// --- .../android/tv/ui/dialog/ConfigDialog.java | 3 +++ .../com/fongmi/android/tv/api/ApiConfig.java | 6 ++--- .../com/fongmi/android/tv/api/Decoder.java | 6 +++-- .../java/com/fongmi/android/tv/server/Go.java | 3 ++- .../com/fongmi/android/tv/server/Nano.java | 4 ++-- .../com/fongmi/android/tv/utils/UrlUtil.java | 2 ++ .../android/tv/ui/dialog/ConfigDialog.java | 3 +++ .../java/com/github/catvod/utils/Asset.java | 24 +++++++++++++++++++ .../java/com/github/catvod/utils/Path.java | 16 ------------- .../java/com/gsoft/mitv/MainActivity.java | 3 ++- quickjs/build.gradle | 4 ++++ .../com/fongmi/quickjs/crawler/Spider.java | 6 ++--- .../java/com/fongmi/quickjs/utils/Module.java | 5 ++-- 13 files changed, 55 insertions(+), 30 deletions(-) create mode 100644 catvod/src/main/java/com/github/catvod/utils/Asset.java diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/ConfigDialog.java b/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/ConfigDialog.java index 58a7f774f..7797ca291 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/ConfigDialog.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/ConfigDialog.java @@ -130,6 +130,9 @@ public class ConfigDialog implements DialogInterface.OnDismissListener { } else if (append && s.equalsIgnoreCase("f")) { append = false; binding.text.append("ile://"); + } else if (append && s.equalsIgnoreCase("a")) { + append = false; + binding.text.append("ssets://"); } else if (s.length() > 1) { append = false; } else if (s.length() == 0) { 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 1470e7257..aa0924b1a 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 @@ -214,17 +214,17 @@ public class ApiConfig { if (TextUtils.isEmpty(api)) return api; if (api.startsWith("http")) return api; if (api.startsWith("file")) return UrlUtil.convert(api); - if (api.endsWith(".js")) return parseApi(UrlUtil.convert(config.getUrl(), api)); + if (api.endsWith(".js") || api.endsWith(".py")) return parseApi(UrlUtil.convert(config.getUrl(), api)); return api; } private String parseExt(String ext) { if (TextUtils.isEmpty(ext)) return ext; if (ext.startsWith("http")) return ext; - if (ext.startsWith("file")) return UrlUtil.convert(ext); if (ext.startsWith("img+")) return Decoder.getExt(ext); + if (ext.startsWith("file")) return UrlUtil.convert(ext); if (ext.contains("http") || ext.contains("file")) return ext; - if (ext.endsWith(".txt") || ext.endsWith(".json") || ext.endsWith(".py") || ext.endsWith(".js")) return parseExt(UrlUtil.convert(config.getUrl(), ext)); + if (ext.endsWith(".txt") || ext.endsWith(".json") || ext.endsWith(".js") || ext.endsWith(".py")) return parseExt(UrlUtil.convert(config.getUrl(), ext)); return ext; } 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 0509555a7..4f7dca2c7 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 @@ -4,6 +4,7 @@ import android.util.Base64; import com.fongmi.android.tv.utils.UrlUtil; import com.github.catvod.net.OkHttp; +import com.github.catvod.utils.Asset; import com.github.catvod.utils.Json; import com.github.catvod.utils.Path; import com.github.catvod.utils.Util; @@ -32,7 +33,7 @@ public class Decoder { } private static String fix(String url, String data) { - if (url.startsWith("file")) url = UrlUtil.convert(url); + if (url.startsWith("file") || url.startsWith("assets")) url = UrlUtil.convert(url); data = data.replace("./", url.substring(0, url.lastIndexOf("/") + 1)); return data; } @@ -58,8 +59,9 @@ public class Decoder { } private static String getData(String url) { - if (url.startsWith("http")) return OkHttp.string(url); if (url.startsWith("file")) return Path.read(url); + if (url.startsWith("assets")) return Asset.read(url); + if (url.startsWith("http")) return OkHttp.string(url); return ""; } diff --git a/app/src/main/java/com/fongmi/android/tv/server/Go.java b/app/src/main/java/com/fongmi/android/tv/server/Go.java index fd4c9810d..94389f285 100644 --- a/app/src/main/java/com/fongmi/android/tv/server/Go.java +++ b/app/src/main/java/com/fongmi/android/tv/server/Go.java @@ -1,5 +1,6 @@ package com.fongmi.android.tv.server; +import com.github.catvod.utils.Asset; import com.github.catvod.utils.Path; import com.github.catvod.utils.Shell; @@ -12,7 +13,7 @@ public class Go { public static void start() { new Thread(() -> { File file = Path.cache(GO); - if (!file.exists()) Path.copy(Path.getAsset(GO), file); + if (!file.exists()) Path.copy(Asset.open(GO), file); Shell.exec("killall -9 " + GO); Shell.exec("nohup " + file); }).start(); diff --git a/app/src/main/java/com/fongmi/android/tv/server/Nano.java b/app/src/main/java/com/fongmi/android/tv/server/Nano.java index 9ac3b4756..1f32821e1 100644 --- a/app/src/main/java/com/fongmi/android/tv/server/Nano.java +++ b/app/src/main/java/com/fongmi/android/tv/server/Nano.java @@ -10,7 +10,7 @@ import com.fongmi.android.tv.server.process.Cache; import com.fongmi.android.tv.server.process.Local; import com.fongmi.android.tv.server.process.Process; import com.fongmi.android.tv.utils.M3U8; -import com.github.catvod.utils.Path; +import com.github.catvod.utils.Asset; import com.google.common.net.HttpHeaders; import java.io.ByteArrayInputStream; @@ -120,7 +120,7 @@ public class Nano extends NanoHTTPD { private Response getAssets(String path) { try { if (path.isEmpty()) path = "index.html"; - InputStream is = Path.getAsset(path); + InputStream is = Asset.open(path); return newFixedLengthResponse(Response.Status.OK, getMimeTypeForFile(path), is, is.available()); } catch (IOException e) { return newFixedLengthResponse(Response.Status.NOT_FOUND, MIME_HTML, null); diff --git a/app/src/main/java/com/fongmi/android/tv/utils/UrlUtil.java b/app/src/main/java/com/fongmi/android/tv/utils/UrlUtil.java index bf22c59e2..ea15374b5 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/UrlUtil.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/UrlUtil.java @@ -38,6 +38,7 @@ public class UrlUtil { public static String convert(String baseUrl, String path) { if (path.startsWith("clan")) return fixUrl(path); + if (path.startsWith("assets")) return convert(path); return path.isEmpty() ? "" : UriUtil.resolve(baseUrl, path); } @@ -46,6 +47,7 @@ public class UrlUtil { String scheme = scheme(url); if ("file".equals(scheme)) return Server.get().getAddress(url); if ("local".equals(scheme)) return Server.get().getAddress(host); + if ("assets".equals(scheme)) return Server.get().getAddress(url.substring(9)); if ("proxy".equals(scheme)) return url.replace("proxy://", Server.get().getAddress("proxy?")); return url; } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/ConfigDialog.java b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/ConfigDialog.java index 56e98539d..4d80397b3 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/ConfigDialog.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/ConfigDialog.java @@ -109,6 +109,9 @@ public class ConfigDialog { } else if (append && s.equalsIgnoreCase("f")) { append = false; binding.text.append("ile://"); + } else if (append && s.equalsIgnoreCase("a")) { + append = false; + binding.text.append("ssets://"); } else if (s.length() > 1) { append = false; } else if (s.length() == 0) { diff --git a/catvod/src/main/java/com/github/catvod/utils/Asset.java b/catvod/src/main/java/com/github/catvod/utils/Asset.java new file mode 100644 index 000000000..4db4e16ea --- /dev/null +++ b/catvod/src/main/java/com/github/catvod/utils/Asset.java @@ -0,0 +1,24 @@ +package com.github.catvod.utils; + +import com.github.catvod.Init; + +import java.io.InputStream; + +public class Asset { + + public static InputStream open(String fileName) { + try { + return Init.context().getAssets().open(fileName.replace("assets://", "")); + } catch (Exception e) { + return null; + } + } + + public static String read(String fileName) { + try { + return Path.read(open(fileName)); + } catch (Exception e) { + return ""; + } + } +} diff --git a/catvod/src/main/java/com/github/catvod/utils/Path.java b/catvod/src/main/java/com/github/catvod/utils/Path.java index 71898f9f4..1c907e398 100644 --- a/catvod/src/main/java/com/github/catvod/utils/Path.java +++ b/catvod/src/main/java/com/github/catvod/utils/Path.java @@ -114,22 +114,6 @@ public class Path { return file2.exists() ? file2 : file1.exists() ? file1 : new File(path); } - public static InputStream getAsset(String fileName) { - try { - return Init.context().getAssets().open(fileName); - } catch (Exception e) { - return null; - } - } - - public static String asset(String fileName) { - try { - return read(getAsset(fileName)); - } catch (Exception e) { - return ""; - } - } - public static String read(File file) { try { return read(new FileInputStream(file)); diff --git a/forcetech/src/main/java/com/gsoft/mitv/MainActivity.java b/forcetech/src/main/java/com/gsoft/mitv/MainActivity.java index c4b43c810..e09330c05 100644 --- a/forcetech/src/main/java/com/gsoft/mitv/MainActivity.java +++ b/forcetech/src/main/java/com/gsoft/mitv/MainActivity.java @@ -6,6 +6,7 @@ import android.os.IBinder; import com.anymediacloud.iptv.standard.ForceTV; import com.forcetech.Util; +import com.github.catvod.utils.Asset; import com.github.catvod.utils.Path; import java.io.File; @@ -27,7 +28,7 @@ public class MainActivity extends Service { private void checkLibrary() { String name = "libmitv.so"; File file = Path.cache(name); - if (!file.exists()) Path.copy(Path.getAsset(name), file); + if (!file.exists()) Path.copy(Asset.open(name), file); } @Override diff --git a/quickjs/build.gradle b/quickjs/build.gradle index 228a6aa0c..1097e0aa5 100644 --- a/quickjs/build.gradle +++ b/quickjs/build.gradle @@ -9,6 +9,10 @@ android { minSdk 21 targetSdk 28 } + + lint { + disable 'UnsafeOptInUsageError' + } } dependencies { diff --git a/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java b/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java index 0be114829..0ea6fd31a 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java @@ -11,8 +11,8 @@ import com.fongmi.quickjs.method.Global; import com.fongmi.quickjs.method.Local; import com.fongmi.quickjs.utils.JSUtil; import com.fongmi.quickjs.utils.Module; +import com.github.catvod.utils.Asset; import com.github.catvod.utils.Json; -import com.github.catvod.utils.Path; import com.whl.quickjs.wrapper.JSArray; import com.whl.quickjs.wrapper.JSMethod; import com.whl.quickjs.wrapper.JSObject; @@ -144,7 +144,7 @@ public class Spider extends com.github.catvod.crawler.Spider { private void createCtx() { ctx = QuickJSContext.create(); ctx.setConsole(new Console()); - ctx.evaluate(Path.asset("js/lib/http.js")); + ctx.evaluate(Asset.read("js/lib/http.js")); Global.create(ctx, executor).setProperty(); ctx.getGlobalObject().setProperty("local", Local.class); ctx.setModuleLoader(new QuickJSContext.BytecodeModuleLoader() { @@ -211,7 +211,7 @@ public class Spider extends com.github.catvod.crawler.Spider { String content = Module.get().fetch(api); if (content.startsWith("//bb")) ctx.execute(Module.get().bb(content)); else ctx.evaluateModule(content.replace(spider, global), api); - ctx.evaluateModule(String.format(Path.asset("js/lib/spider.js"), api)); + ctx.evaluateModule(String.format(Asset.read("js/lib/spider.js"), api)); if (content.startsWith("//bb") || content.contains(jsEval)) cat = true; jsObject = (JSObject) ctx.getProperty(ctx.getGlobalObject(), spider); } diff --git a/quickjs/src/main/java/com/fongmi/quickjs/utils/Module.java b/quickjs/src/main/java/com/fongmi/quickjs/utils/Module.java index 12effbe0a..7f205f54c 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/utils/Module.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/utils/Module.java @@ -4,6 +4,7 @@ import android.net.Uri; import android.util.Base64; import com.github.catvod.net.OkHttp; +import com.github.catvod.utils.Asset; import com.github.catvod.utils.Path; import com.google.common.net.HttpHeaders; @@ -33,8 +34,8 @@ public class Module { public String fetch(String name) { if (cache.contains(name)) return cache.get(name); if (name.startsWith("http")) cache.put(name, request(name)); - if (name.startsWith("lib/")) cache.put(name, Path.asset("js/" + name)); - if (name.startsWith("assets")) cache.put(name, Path.asset(name.substring(9))); + if (name.startsWith("assets")) cache.put(name, Asset.read(name)); + if (name.startsWith("lib/")) cache.put(name, Asset.read("js/" + name)); return cache.get(name); }