From 8c69744222c9170bafc5e40177c7b0134fd8b334 Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 28 Jul 2022 17:08:18 +0800 Subject: [PATCH] Support proxy - part 1 --- .../java/com/fongmi/bear/player/ExoUtil.java | 2 +- .../java/com/fongmi/bear/server/Nano.java | 58 +++++++++++++++++++ .../java/com/fongmi/bear/server/Server.java | 52 +++++++++++++++-- .../fongmi/bear/ui/activity/HomeActivity.java | 5 +- .../java/com/fongmi/bear/utils/Utils.java | 8 +++ 5 files changed, 118 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/com/fongmi/bear/server/Nano.java diff --git a/app/src/main/java/com/fongmi/bear/player/ExoUtil.java b/app/src/main/java/com/fongmi/bear/player/ExoUtil.java index fe05cb7b9..d87002077 100644 --- a/app/src/main/java/com/fongmi/bear/player/ExoUtil.java +++ b/app/src/main/java/com/fongmi/bear/player/ExoUtil.java @@ -27,7 +27,7 @@ public class ExoUtil { DataSource.Factory factory = getFactory(headers, url); MediaItem mediaItem = new MediaItem.Builder().setUri(videoUri).build(); int type = Util.inferContentType(videoUri); - if (type == C.CONTENT_TYPE_HLS || url.contains(".php") || url.contains(".m3u8")) { + if (type == C.CONTENT_TYPE_HLS || url.contains(".php") || url.contains("m3u8")) { return new HlsMediaSource.Factory(factory).createMediaSource(mediaItem); } else if (type == C.CONTENT_TYPE_DASH) { return new DashMediaSource.Factory(factory).createMediaSource(mediaItem); diff --git a/app/src/main/java/com/fongmi/bear/server/Nano.java b/app/src/main/java/com/fongmi/bear/server/Nano.java new file mode 100644 index 000000000..fa28b8da3 --- /dev/null +++ b/app/src/main/java/com/fongmi/bear/server/Nano.java @@ -0,0 +1,58 @@ +package com.fongmi.bear.server; + +import com.fongmi.bear.ApiConfig; + +import java.io.InputStream; +import java.util.Map; + +import fi.iki.elonen.NanoHTTPD; + +public class Nano extends NanoHTTPD { + + private Listener mListener; + + public Nano() { + super(9978); + } + + @Override + public Response serve(IHTTPSession session) { + if (session.getUri().isEmpty()) return super.serve(session); + String url = session.getUri().trim(); + if (url.indexOf('?') >= 0) url = url.substring(0, url.indexOf('?')); + if (session.getMethod() == Method.GET) { + if (url.equals("/proxy")) { + Map params = session.getParms(); + if (params.containsKey("do")) { + Object[] rs = ApiConfig.get().proxyLocal(params); + try { + int code = (int) rs[0]; + String mime = (String) rs[1]; + InputStream stream = rs[2] != null ? (InputStream) rs[2] : null; + return NanoHTTPD.newChunkedResponse(Response.Status.lookup(code), mime, stream); + } catch (Exception e) { + return NanoHTTPD.newFixedLengthResponse(NanoHTTPD.Response.Status.INTERNAL_ERROR, NanoHTTPD.MIME_PLAINTEXT, "500"); + } + } + } + } + return super.serve(session); + } + + public Listener getListener() { + return mListener; + } + + public void setListener(Listener listener) { + this.mListener = listener; + } + + public interface Listener { + + void onTextReceived(String text); + + void onApiReceived(String url); + + void onPushReceived(String url); + } +} diff --git a/app/src/main/java/com/fongmi/bear/server/Server.java b/app/src/main/java/com/fongmi/bear/server/Server.java index 6eedb67d1..3b328628b 100644 --- a/app/src/main/java/com/fongmi/bear/server/Server.java +++ b/app/src/main/java/com/fongmi/bear/server/Server.java @@ -1,12 +1,54 @@ package com.fongmi.bear.server; -import fi.iki.elonen.NanoHTTPD; +import com.fongmi.bear.utils.Utils; -public class Server extends NanoHTTPD { +public class Server implements Nano.Listener { - public static int port = 9978; + private Nano mNano; + + private static class Loader { + static volatile Server INSTANCE = new Server(); + } + + public static Server get() { + return Loader.INSTANCE; + } + + public String getAddress(boolean local) { + return "http://" + (local ? "127.0.0.1" : Utils.getIP()) + ":" + mNano.getListeningPort() + "/"; + } + + public void start() { + if (mNano != null) return; + try { + mNano = new Nano(); + mNano.setListener(this); + mNano.start(); + } catch (Exception e) { + mNano.stop(); + mNano = null; + } + } + + public void stop() { + if (mNano != null) { + mNano.stop(); + mNano = null; + } + } + + @Override + public void onTextReceived(String text) { + + } + + @Override + public void onApiReceived(String url) { + + } + + @Override + public void onPushReceived(String url) { - public Server() { - super(port); } } diff --git a/app/src/main/java/com/fongmi/bear/ui/activity/HomeActivity.java b/app/src/main/java/com/fongmi/bear/ui/activity/HomeActivity.java index 4fcbe1943..efad94c54 100644 --- a/app/src/main/java/com/fongmi/bear/ui/activity/HomeActivity.java +++ b/app/src/main/java/com/fongmi/bear/ui/activity/HomeActivity.java @@ -22,6 +22,7 @@ import com.fongmi.bear.bean.Vod; import com.fongmi.bear.databinding.ActivityHomeBinding; import com.fongmi.bear.model.SiteViewModel; import com.fongmi.bear.player.Players; +import com.fongmi.bear.server.Server; import com.fongmi.bear.ui.custom.CustomRowPresenter; import com.fongmi.bear.ui.custom.CustomSelector; import com.fongmi.bear.ui.presenter.FuncPresenter; @@ -55,6 +56,7 @@ public class HomeActivity extends BaseActivity implements VodPresenter.OnClickLi @Override protected void initView() { Clock.start(mBinding.time); + Server.get().start(); Players.get().init(); setRecyclerView(); setViewModel(); @@ -160,8 +162,9 @@ public class HomeActivity extends BaseActivity implements VodPresenter.OnClickLi @Override protected void onDestroy() { - Players.get().release(); ApiConfig.get().clear(); + Players.get().release(); + Server.get().stop(); super.onDestroy(); Clock.destroy(); } diff --git a/app/src/main/java/com/fongmi/bear/utils/Utils.java b/app/src/main/java/com/fongmi/bear/utils/Utils.java index 58ede3381..f01fb7cb9 100644 --- a/app/src/main/java/com/fongmi/bear/utils/Utils.java +++ b/app/src/main/java/com/fongmi/bear/utils/Utils.java @@ -2,9 +2,12 @@ package com.fongmi.bear.utils; import android.app.Activity; import android.app.PictureInPictureParams; +import android.content.Context; import android.content.pm.PackageManager; +import android.net.wifi.WifiManager; import android.os.Build; import android.provider.Settings; +import android.text.format.Formatter; import android.util.Rational; import android.view.View; @@ -37,6 +40,11 @@ public class Utils { activity.getWindow().getDecorView().setSystemUiVisibility(flags); } + public static String getIP() { + WifiManager manager = (WifiManager) App.get().getApplicationContext().getSystemService(Context.WIFI_SERVICE); + return Formatter.formatIpAddress(manager.getConnectionInfo().getIpAddress()); + } + public static String getUUID() { return Settings.Secure.getString(App.get().getContentResolver(), Settings.Secure.ANDROID_ID); }