okjack
FongMi 3 years ago
parent e0754ab530
commit 3e91af53e6
  1. 5
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java
  2. 6
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java
  3. 2
      app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/ConfigDialog.java
  4. 7
      app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/UaDialog.java
  5. 2
      app/src/main/java/com/fongmi/android/tv/bean/Depot.java
  6. 5
      app/src/main/java/com/fongmi/android/tv/bean/Device.java
  7. 2
      app/src/main/java/com/fongmi/android/tv/bean/Epg.java
  8. 6
      app/src/main/java/com/fongmi/android/tv/player/Players.java
  9. 6
      app/src/main/java/com/fongmi/android/tv/player/Source.java
  10. 3
      app/src/main/java/com/fongmi/android/tv/player/extractor/Force.java
  11. 3
      app/src/main/java/com/fongmi/android/tv/player/extractor/Thunder.java
  12. 4
      app/src/main/java/com/fongmi/android/tv/utils/Sniffer.java
  13. 38
      app/src/main/java/com/fongmi/android/tv/utils/UrlUtil.java
  14. 50
      app/src/main/java/com/fongmi/android/tv/utils/Util.java
  15. 4
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/MainActivity.java
  16. 2
      app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/ConfigDialog.java
  17. 7
      app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/UaDialog.java
  18. 6
      app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java
  19. 72
      catvod/src/main/java/com/github/catvod/utils/Util.java

@ -52,7 +52,8 @@ import com.fongmi.android.tv.utils.FileChooser;
import com.fongmi.android.tv.utils.KeyUtil;
import com.fongmi.android.tv.utils.Notify;
import com.fongmi.android.tv.utils.ResUtil;
import com.github.catvod.utils.Util;
import com.fongmi.android.tv.utils.UrlUtil;
import com.fongmi.android.tv.utils.Util;
import com.google.common.collect.Lists;
import org.greenrobot.eventbus.Subscribe;
@ -114,7 +115,7 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen
if (Intent.ACTION_SEND.equals(intent.getAction())) {
VideoActivity.push(this, Uri.parse(intent.getStringExtra(Intent.EXTRA_TEXT)));
} else if (Intent.ACTION_VIEW.equals(intent.getAction()) && intent.getData() != null) {
if ("text/plain".equals(intent.getType()) || Util.path(intent.getData()).endsWith(".m3u")) {
if ("text/plain".equals(intent.getType()) || UrlUtil.path(intent.getData()).endsWith(".m3u")) {
loadLive("file:/" + FileChooser.getPathFromUri(this, intent.getData()));
} else {
VideoActivity.push(this, intent.getData());

@ -36,9 +36,9 @@ import com.fongmi.android.tv.ui.custom.dialog.SiteDialog;
import com.fongmi.android.tv.utils.FileUtil;
import com.fongmi.android.tv.utils.Notify;
import com.fongmi.android.tv.utils.ResUtil;
import com.fongmi.android.tv.utils.UrlUtil;
import com.github.catvod.bean.Doh;
import com.github.catvod.net.OkHttp;
import com.github.catvod.utils.Util;
import com.permissionx.guolindev.PermissionX;
import java.util.ArrayList;
@ -81,7 +81,7 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit
mBinding.wallUrl.setText(WallConfig.getDesc());
mBinding.dohText.setText(getDohList()[getDohIndex()]);
mBinding.versionText.setText(BuildConfig.VERSION_NAME);
mBinding.proxyText.setText(Util.scheme(Setting.getProxy()));
mBinding.proxyText.setText(UrlUtil.scheme(Setting.getProxy()));
mBinding.sizeText.setText((size = ResUtil.getStringArray(R.array.select_size))[Setting.getSize()]);
mBinding.scaleText.setText((scale = ResUtil.getStringArray(R.array.select_scale))[Setting.getScale()]);
mBinding.playerText.setText((player = ResUtil.getStringArray(R.array.select_player))[Setting.getPlayer()]);
@ -327,7 +327,7 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit
OkHttp.get().setProxy(proxy);
Notify.progress(getActivity());
ApiConfig.load(Config.vod(), getCallback());
mBinding.proxyText.setText(Util.scheme(proxy));
mBinding.proxyText.setText(UrlUtil.scheme(proxy));
}
private void onCache(View view) {

@ -131,7 +131,7 @@ public class ConfigDialog implements DialogInterface.OnDismissListener {
}
private void onPositive(View view) {
String text = UrlUtil.checkClan(binding.text.getText().toString().trim());
String text = UrlUtil.fixUrl(binding.text.getText().toString().trim());
if (text.isEmpty()) Config.delete(url, type);
callback.setConfig(Config.find(text, type));
dialog.dismiss();

@ -19,14 +19,13 @@ import com.fongmi.android.tv.server.Server;
import com.fongmi.android.tv.ui.custom.CustomTextListener;
import com.fongmi.android.tv.utils.QRCode;
import com.fongmi.android.tv.utils.ResUtil;
import com.github.catvod.utils.Util;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import okhttp3.internal.Util;
public class UaDialog implements DialogInterface.OnDismissListener {
private final DialogUaBinding binding;
@ -88,10 +87,10 @@ public class UaDialog implements DialogInterface.OnDismissListener {
private void detect(String s) {
if (append && s.equalsIgnoreCase("c")) {
append = false;
binding.text.setText(com.github.catvod.utils.Util.CHROME);
binding.text.setText(Util.CHROME);
} else if (append && s.equalsIgnoreCase("o")) {
append = false;
binding.text.setText(Util.userAgent);
binding.text.setText(okhttp3.internal.Util.userAgent);
} else if (s.length() > 1) {
append = false;
} else if (s.length() == 0) {

@ -25,7 +25,7 @@ public class Depot {
}
public String getUrl() {
return TextUtils.isEmpty(url) ? "" : UrlUtil.checkClan(url);
return TextUtils.isEmpty(url) ? "" : UrlUtil.fixUrl(url);
}
public String getName() {

@ -11,7 +11,8 @@ import com.fongmi.android.tv.App;
import com.fongmi.android.tv.Product;
import com.fongmi.android.tv.db.AppDatabase;
import com.fongmi.android.tv.server.Server;
import com.github.catvod.utils.Util;
import com.fongmi.android.tv.utils.UrlUtil;
import com.fongmi.android.tv.utils.Util;
import com.google.gson.annotations.SerializedName;
import java.util.List;
@ -101,7 +102,7 @@ public class Device {
}
public String getHost() {
return isDLNA() ? getUuid() : Util.host(getIp());
return isDLNA() ? getUuid() : UrlUtil.host(getIp());
}
public Device save() {

@ -5,8 +5,8 @@ import android.text.TextUtils;
import com.fongmi.android.tv.App;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.utils.ResUtil;
import com.fongmi.android.tv.utils.Util;
import com.github.catvod.utils.Trans;
import com.github.catvod.utils.Util;
import com.google.gson.annotations.SerializedName;
import java.text.SimpleDateFormat;

@ -31,8 +31,8 @@ import com.fongmi.android.tv.impl.SessionCallback;
import com.fongmi.android.tv.utils.Notify;
import com.fongmi.android.tv.utils.ResUtil;
import com.fongmi.android.tv.utils.UrlUtil;
import com.fongmi.android.tv.utils.Util;
import com.github.catvod.utils.Path;
import com.github.catvod.utils.Util;
import com.google.common.net.HttpHeaders;
import com.orhanobut.logger.Logger;
@ -492,8 +492,8 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, Analytic
private boolean isIllegal(String url) {
Uri uri = UrlUtil.uri(url);
String host = Util.host(uri);
String scheme = Util.scheme(uri);
String host = UrlUtil.host(uri);
String scheme = UrlUtil.scheme(uri);
if (scheme.equals("data")) return false;
return scheme.isEmpty() || scheme.equals("file") ? !Path.exists(url) : host.isEmpty();
}

@ -10,7 +10,7 @@ import com.fongmi.android.tv.player.extractor.TVBus;
import com.fongmi.android.tv.player.extractor.Thunder;
import com.fongmi.android.tv.player.extractor.Youtube;
import com.fongmi.android.tv.player.extractor.ZLive;
import com.github.catvod.utils.Util;
import com.fongmi.android.tv.utils.UrlUtil;
import java.util.ArrayList;
import java.util.List;
@ -40,8 +40,8 @@ public class Source {
}
private Extractor getExtractor(String url) {
String host = Util.host(url);
String scheme = Util.scheme(url);
String host = UrlUtil.host(url);
String scheme = UrlUtil.scheme(url);
for (Extractor extractor : extractors) if (extractor.match(scheme, host)) return extractor;
return null;
}

@ -9,6 +9,7 @@ import android.os.SystemClock;
import com.fongmi.android.tv.App;
import com.fongmi.android.tv.player.Source;
import com.fongmi.android.tv.utils.UrlUtil;
import com.forcetech.Util;
import com.github.catvod.net.OkHttp;
import com.github.catvod.utils.Github;
@ -33,7 +34,7 @@ public class Force implements Source.Extractor {
@Override
public String fetch(String url) throws Exception {
String scheme = Util.scheme(url);
String scheme = UrlUtil.scheme(url);
if (!set.contains(scheme)) init(scheme);
while (!set.contains(scheme)) SystemClock.sleep(10);
Uri uri = Uri.parse(url);

@ -5,6 +5,7 @@ import android.os.SystemClock;
import com.fongmi.android.tv.exception.ExtractException;
import com.fongmi.android.tv.player.Source;
import com.fongmi.android.tv.utils.UrlUtil;
import com.github.catvod.utils.Path;
import com.github.catvod.utils.Util;
import com.xunlei.downloadlib.XLTaskHelper;
@ -25,7 +26,7 @@ public class Thunder implements Source.Extractor {
@Override
public String fetch(String url) throws Exception {
return Util.scheme(url).equals("magnet") ? addTorrentTask(Uri.parse(url)) : addThunderTask(url);
return UrlUtil.scheme(url).equals("magnet") ? addTorrentTask(Uri.parse(url)) : addThunderTask(url);
}
private String addTorrentTask(Uri uri) throws Exception {

@ -29,7 +29,7 @@ public class Sniffer {
}
public static boolean isThunder(String url) {
return THUNDER.contains(Util.scheme(url)) || isTorrent(url);
return THUNDER.contains(UrlUtil.scheme(url)) || isTorrent(url);
}
public static boolean isTorrent(String url) {
@ -57,7 +57,7 @@ public class Sniffer {
public static List<String> getRegex(Uri uri) {
if (uri.getHost() == null) return Collections.emptyList();
String hosts = TextUtils.join(",", Arrays.asList(Util.host(uri), Util.host(uri.getQueryParameter("url"))));
String hosts = TextUtils.join(",", Arrays.asList(UrlUtil.host(uri), UrlUtil.host(uri.getQueryParameter("url"))));
for (Rule rule : ApiConfig.get().getRules()) for (String host : rule.getHosts()) if (Util.containOrMatch(hosts, host)) return rule.getRegex();
return Collections.emptyList();
}

@ -5,7 +5,6 @@ import android.net.Uri;
import androidx.media3.common.util.UriUtil;
import com.fongmi.android.tv.server.Server;
import com.github.catvod.utils.Util;
import com.google.common.net.HttpHeaders;
public class UrlUtil {
@ -14,26 +13,49 @@ public class UrlUtil {
return Uri.parse(url.trim().replace("\\", ""));
}
public static String checkClan(String url) {
if (url.contains("/localhost/")) url = url.replace("/localhost/", "/");
if (url.startsWith("clan")) url = url.replace("clan", "file");
return url;
public static String scheme(String url) {
return url == null ? "" : scheme(Uri.parse(url));
}
public static String scheme(Uri uri) {
String scheme = uri.getScheme();
return scheme == null ? "" : scheme.toLowerCase().trim();
}
public static String host(String url) {
return url == null ? "" : host(Uri.parse(url));
}
public static String host(Uri uri) {
String host = uri.getHost();
return host == null ? "" : host.toLowerCase().trim();
}
public static String path(Uri uri) {
String path = uri.getPath();
return path == null ? "" : path.trim();
}
public static String convert(String baseUrl, String path) {
if (path.startsWith("clan")) return checkClan(path);
if (path.startsWith("clan")) return fixUrl(path);
return path.isEmpty() ? "" : UriUtil.resolve(baseUrl, path);
}
public static String convert(String url) {
String host = Util.host(url);
String scheme = Util.scheme(url);
String host = host(url);
String scheme = scheme(url);
if ("file".equals(scheme)) return Server.get().getAddress(url);
if ("local".equals(scheme)) return Server.get().getAddress(host);
if ("proxy".equals(scheme)) return url.replace("proxy://", Server.get().getAddress("proxy?"));
return url;
}
public static String fixUrl(String url) {
if (url.contains("/localhost/")) url = url.replace("/localhost/", "/");
if (url.startsWith("clan")) url = url.replace("clan", "file");
return url;
}
public static String fixHeader(String key) {
if (key.equalsIgnoreCase(HttpHeaders.USER_AGENT)) return HttpHeaders.USER_AGENT;
if (key.equalsIgnoreCase(HttpHeaders.REFERER)) return HttpHeaders.REFERER;

@ -3,6 +3,7 @@ package com.fongmi.android.tv.utils;
import android.app.Activity;
import android.content.ClipboardManager;
import android.content.Context;
import android.os.Build;
import android.os.IBinder;
import android.provider.Settings;
import android.view.View;
@ -11,6 +12,10 @@ import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import com.fongmi.android.tv.App;
import com.github.catvod.Init;
import java.text.SimpleDateFormat;
import java.util.Formatter;
public class Util {
@ -39,6 +44,16 @@ public class Util {
imm.hideSoftInputFromWindow(windowToken, 0);
}
public static float getBrightness(Activity activity) {
try {
float value = activity.getWindow().getAttributes().screenBrightness;
if (WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_FULL >= value && value >= WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_OFF) return value;
return Settings.System.getFloat(activity.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS) / 128;
} catch (Exception e) {
return 0.5f;
}
}
public static CharSequence getClipText() {
return ((ClipboardManager) App.get().getSystemService(Context.CLIPBOARD_SERVICE)).getText();
}
@ -52,13 +67,38 @@ public class Util {
}
}
public static float getBrightness(Activity activity) {
public static String getDeviceId() {
return Settings.Secure.getString(Init.context().getContentResolver(), Settings.Secure.ANDROID_ID);
}
public static String getDeviceName() {
String model = Build.MODEL;
String manufacturer = Build.MANUFACTURER;
return model.startsWith(manufacturer) ? model : manufacturer + " " + model;
}
public static String substring(String text) {
return substring(text, 1);
}
public static String substring(String text, int num) {
if (text != null && text.length() > num) return text.substring(0, text.length() - num);
return text;
}
public static long format(SimpleDateFormat format, String src) {
try {
float value = activity.getWindow().getAttributes().screenBrightness;
if (WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_FULL >= value && value >= WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_OFF) return value;
return Settings.System.getFloat(activity.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS) / 128;
return format.parse(src).getTime();
} catch (Exception e) {
return 0.5f;
return 0;
}
}
public static String format(StringBuilder builder, Formatter formatter, long timeMs) {
try {
return androidx.media3.common.util.Util.getStringForTime(builder, formatter, timeMs);
} catch (Exception e) {
return "";
}
}
}

@ -30,7 +30,7 @@ import com.fongmi.android.tv.ui.fragment.SettingPlayerFragment;
import com.fongmi.android.tv.ui.fragment.VodFragment;
import com.fongmi.android.tv.utils.FileChooser;
import com.fongmi.android.tv.utils.Notify;
import com.github.catvod.utils.Util;
import com.fongmi.android.tv.utils.UrlUtil;
import com.google.android.material.navigation.NavigationBarView;
import org.greenrobot.eventbus.Subscribe;
@ -70,7 +70,7 @@ public class MainActivity extends BaseActivity implements NavigationBarView.OnIt
if (Intent.ACTION_SEND.equals(intent.getAction())) {
VideoActivity.push(this, Uri.parse(intent.getStringExtra(Intent.EXTRA_TEXT)));
} else if (Intent.ACTION_VIEW.equals(intent.getAction()) && intent.getData() != null) {
if ("text/plain".equals(intent.getType()) || Util.path(intent.getData()).endsWith(".m3u")) {
if ("text/plain".equals(intent.getType()) || UrlUtil.path(intent.getData()).endsWith(".m3u")) {
loadLive("file:/" + FileChooser.getPathFromUri(this, intent.getData()));
} else {
VideoActivity.push(this, intent.getData());

@ -111,7 +111,7 @@ public class ConfigDialog {
}
private void onPositive(DialogInterface dialog, int which) {
String text = UrlUtil.checkClan(binding.text.getText().toString().trim());
String text = UrlUtil.fixUrl(binding.text.getText().toString().trim());
if (text.isEmpty()) Config.delete(url, type);
callback.setConfig(Config.find(text, type));
dialog.dismiss();

@ -13,10 +13,9 @@ import com.fongmi.android.tv.Setting;
import com.fongmi.android.tv.databinding.DialogUaBinding;
import com.fongmi.android.tv.impl.UaCallback;
import com.fongmi.android.tv.ui.custom.CustomTextListener;
import com.github.catvod.utils.Util;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import okhttp3.internal.Util;
public class UaDialog {
private final DialogUaBinding binding;
@ -68,10 +67,10 @@ public class UaDialog {
private void detect(String s) {
if (append && s.equalsIgnoreCase("c")) {
append = false;
binding.text.setText(com.github.catvod.utils.Util.CHROME);
binding.text.setText(Util.CHROME);
} else if (append && s.equalsIgnoreCase("o")) {
append = false;
binding.text.setText(Util.userAgent);
binding.text.setText(okhttp3.internal.Util.userAgent);
} else if (s.length() > 1) {
append = false;
} else if (s.length() == 0) {

@ -40,10 +40,10 @@ import com.fongmi.android.tv.utils.FileChooser;
import com.fongmi.android.tv.utils.FileUtil;
import com.fongmi.android.tv.utils.Notify;
import com.fongmi.android.tv.utils.ResUtil;
import com.fongmi.android.tv.utils.UrlUtil;
import com.github.catvod.bean.Doh;
import com.github.catvod.net.OkHttp;
import com.github.catvod.utils.Path;
import com.github.catvod.utils.Util;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.permissionx.guolindev.PermissionX;
@ -90,7 +90,7 @@ public class SettingFragment extends BaseFragment implements ConfigCallback, Sit
mBinding.wallUrl.setText(WallConfig.getDesc());
mBinding.dohText.setText(getDohList()[getDohIndex()]);
mBinding.versionText.setText(BuildConfig.VERSION_NAME);
mBinding.proxyText.setText(Util.scheme(Setting.getProxy()));
mBinding.proxyText.setText(UrlUtil.scheme(Setting.getProxy()));
mBinding.sizeText.setText((size = ResUtil.getStringArray(R.array.select_size))[Setting.getSize()]);
mBinding.scaleText.setText((scale = ResUtil.getStringArray(R.array.select_scale))[Setting.getScale()]);
mBinding.playerText.setText((player = ResUtil.getStringArray(R.array.select_player))[Setting.getPlayer()]);
@ -334,7 +334,7 @@ public class SettingFragment extends BaseFragment implements ConfigCallback, Sit
OkHttp.get().setProxy(proxy);
Notify.progress(getActivity());
ApiConfig.load(Config.vod(), getCallback());
mBinding.proxyText.setText(Util.scheme(proxy));
mBinding.proxyText.setText(UrlUtil.scheme(proxy));
}
private void onCache(View view) {

@ -1,35 +1,19 @@
package com.github.catvod.utils;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Base64;
import com.github.catvod.Init;
import java.io.File;
import java.io.FileInputStream;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Formatter;
public class Util {
public static final String CHROME = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36";
public static String getDeviceId() {
return Settings.Secure.getString(Init.context().getContentResolver(), Settings.Secure.ANDROID_ID);
}
public static String getDeviceName() {
String model = Build.MODEL;
String manufacturer = Build.MANUFACTURER;
return model.startsWith(manufacturer) ? model : manufacturer + " " + model;
}
public static String base64(String ext) {
return base64(ext.getBytes());
}
@ -38,42 +22,14 @@ public class Util {
return Base64.encodeToString(bytes, Base64.DEFAULT | Base64.NO_WRAP);
}
public static String substring(String text) {
return substring(text, 1);
}
public static String substring(String text, int num) {
if (text != null && text.length() > num) return text.substring(0, text.length() - num);
return text;
}
public static String scheme(String url) {
return url == null ? "" : scheme(Uri.parse(url));
}
public static String scheme(Uri uri) {
String scheme = uri.getScheme();
return scheme == null ? "" : scheme.toLowerCase().trim();
}
public static String host(String url) {
return url == null ? "" : host(Uri.parse(url));
}
public static String host(Uri uri) {
String host = uri.getHost();
return host == null ? "" : host.toLowerCase().trim();
}
public static String path(Uri uri) {
String path = uri.getPath();
return path == null ? "" : path.trim();
}
public static String basic(Uri uri) {
return "Basic " + base64(uri.getUserInfo());
}
public static boolean equals(String name, String md5) {
return md5(Path.jar(name)).equalsIgnoreCase(md5);
}
public static String md5(String src) {
try {
if (TextUtils.isEmpty(src)) return "";
@ -104,10 +60,6 @@ public class Util {
}
}
public static boolean equals(String name, String md5) {
return md5(Path.jar(name)).equalsIgnoreCase(md5);
}
public static boolean containOrMatch(String text, String regex) {
try {
return text.contains(regex) || text.matches(regex);
@ -115,20 +67,4 @@ public class Util {
return false;
}
}
public static long format(SimpleDateFormat format, String src) {
try {
return format.parse(src).getTime();
} catch (Exception e) {
return 0;
}
}
public static String format(StringBuilder builder, Formatter formatter, long timeMs) {
try {
return androidx.media3.common.util.Util.getStringForTime(builder, formatter, timeMs);
} catch (Exception e) {
return "";
}
}
}

Loading…
Cancel
Save