From 8d299559fb19cf3f178c19bb02f897c2e9e2e085 Mon Sep 17 00:00:00 2001 From: FongMi Date: Fri, 27 Jan 2023 01:02:24 +0800 Subject: [PATCH] Support p2p~p9p --- .../android/tv/player/source/Force.java | 52 ++++++----- forcetech/src/main/AndroidManifest.xml | 40 ++++++++ .../anymediacloud/iptv/standard/ForceTV.java | 2 +- .../src/main/java/com/forcetech/Port.java | 10 -- .../src/main/java/com/forcetech/Util.java | 92 +++++++++++++++++++ .../java/com/forcetech/android/ForceTV.java | 16 ++++ .../com/forcetech/service/P2PService.java | 34 +++++++ .../com/forcetech/service/P3PService.java | 34 +++++++ .../com/forcetech/service/P4PService.java | 34 +++++++ .../com/forcetech/service/P5PService.java | 34 +++++++ .../com/forcetech/service/P6PService.java | 34 +++++++ .../com/forcetech/service/P7PService.java | 34 +++++++ .../com/forcetech/service/P8PService.java | 34 +++++++ .../com/forcetech/service/P9PService.java | 34 +++++++ .../java/com/gsoft/mitv/MainActivity.java | 4 +- 15 files changed, 451 insertions(+), 37 deletions(-) delete mode 100644 forcetech/src/main/java/com/forcetech/Port.java create mode 100644 forcetech/src/main/java/com/forcetech/Util.java create mode 100644 forcetech/src/main/java/com/forcetech/android/ForceTV.java create mode 100644 forcetech/src/main/java/com/forcetech/service/P2PService.java create mode 100644 forcetech/src/main/java/com/forcetech/service/P3PService.java create mode 100644 forcetech/src/main/java/com/forcetech/service/P4PService.java create mode 100644 forcetech/src/main/java/com/forcetech/service/P5PService.java create mode 100644 forcetech/src/main/java/com/forcetech/service/P6PService.java create mode 100644 forcetech/src/main/java/com/forcetech/service/P7PService.java create mode 100644 forcetech/src/main/java/com/forcetech/service/P8PService.java create mode 100644 forcetech/src/main/java/com/forcetech/service/P9PService.java diff --git a/app/src/main/java/com/fongmi/android/tv/player/source/Force.java b/app/src/main/java/com/fongmi/android/tv/player/source/Force.java index 61685bde9..54599a784 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/source/Force.java +++ b/app/src/main/java/com/fongmi/android/tv/player/source/Force.java @@ -2,26 +2,25 @@ package com.fongmi.android.tv.player.source; import android.content.ComponentName; import android.content.Context; -import android.content.Intent; import android.content.ServiceConnection; import android.net.Uri; import android.os.IBinder; import android.os.SystemClock; import com.fongmi.android.tv.App; -import com.fongmi.android.tv.net.OkHttp; import com.fongmi.android.tv.Github; +import com.fongmi.android.tv.net.OkHttp; import com.fongmi.android.tv.utils.FileUtil; -import com.forcetech.Port; -import com.gsoft.mitv.MainActivity; +import com.forcetech.Util; import java.io.File; +import java.util.HashSet; import okhttp3.Headers; public class Force { - private boolean init; + private final HashSet set; private static class Loader { static volatile Force INSTANCE = new Force(); @@ -31,31 +30,28 @@ public class Force { return Loader.INSTANCE; } - private void init() throws Exception { - check(); - start(); - } - - private void check() throws Exception { - File file = FileUtil.getCacheFile("libmitv.so"); - String url = Github.get().getReleasePath("/other/libmitv.so"); - if (!file.exists()) FileUtil.write(file, OkHttp.newCall(url).execute().body().bytes()); + public Force() { + set = new HashSet<>(); } - private void start() { - App.get().bindService(new Intent(App.get(), MainActivity.class), mConn, Context.BIND_AUTO_CREATE); + private void init(String url) throws Exception { + File file = FileUtil.getCacheFile(Util.so(url)); + String path = Github.get().getBranchPath("dev", "/other/jniLibs/" + file.getName()); + if (!file.exists()) FileUtil.write(file, OkHttp.newCall(path).execute().body().bytes()); + App.get().bindService(Util.intent(App.get(), url, file), mConn, Context.BIND_AUTO_CREATE); } public String fetch(String url) { try { - if (!init) init(); - while (!init) SystemClock.sleep(10); - int port = Port.get(url); + String scheme = Util.scheme(url); + if (!set.contains(scheme)) init(url); + while (!set.contains(scheme)) SystemClock.sleep(10); Uri uri = Uri.parse(url); + int port = Util.port(url); String id = uri.getLastPathSegment(); String cmd = "http://127.0.0.1:" + port + "/cmd.xml?cmd=switch_chan&server=" + uri.getHost() + ":" + uri.getPort() + "&id=" + id; String result = "http://127.0.0.1:" + port + "/" + id; - OkHttp.newCall(cmd, Headers.of("user-agent", "MTV")).execute(); + OkHttp.newCall(cmd, Headers.of("user-agent", "MTV")).execute().body().string(); return result; } catch (Exception e) { e.printStackTrace(); @@ -65,22 +61,30 @@ public class Force { public void stop() { try { - if (init) App.get().unbindService(mConn); - init = false; + if (!set.isEmpty()) App.get().unbindService(mConn); } catch (Exception e) { e.printStackTrace(); + } finally { + set.clear(); } } private final ServiceConnection mConn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { - init = true; + set.add(get(name)); } @Override public void onServiceDisconnected(ComponentName name) { - init = false; + set.remove(get(name)); + } + + private String get(ComponentName o) { + String name = o.getClassName().toLowerCase(); + name = name.substring(name.lastIndexOf(".") + 1); + name = name.replace("service", ""); + return name; } }; } diff --git a/forcetech/src/main/AndroidManifest.xml b/forcetech/src/main/AndroidManifest.xml index 001ef1af9..dfb7a7138 100644 --- a/forcetech/src/main/AndroidManifest.xml +++ b/forcetech/src/main/AndroidManifest.xml @@ -4,6 +4,46 @@ + + + + + + + + + + + + + + + + clz(String url) { + switch (scheme(url)) { + case "p2p": + return P2PService.class; + case "p3p": + return P3PService.class; + case "p4p": + return P4PService.class; + case "p5p": + return P5PService.class; + case "p6p": + return P6PService.class; + case "p7p": + return P7PService.class; + case "p8p": + return P8PService.class; + case "p9p": + return P9PService.class; + default: + return MainActivity.class; + } + } + + public static int port(String url) { + switch (scheme(url)) { + case "p2p": + return P2P; + case "p3p": + return P3P; + case "p4p": + return P4P; + case "p5p": + return P5P; + case "p6p": + return P6P; + case "p7p": + return P7P; + case "p8p": + return P8P; + case "p9p": + return P9P; + default: + return MTV; + } + } +} diff --git a/forcetech/src/main/java/com/forcetech/android/ForceTV.java b/forcetech/src/main/java/com/forcetech/android/ForceTV.java new file mode 100644 index 000000000..ddd150591 --- /dev/null +++ b/forcetech/src/main/java/com/forcetech/android/ForceTV.java @@ -0,0 +1,16 @@ +package com.forcetech.android; + +public class ForceTV { + + public void start(String lib, int port) { + try { + System.load(lib); + start(port, 20 * 1024 * 1024); + } catch (Throwable ignored) { + } + } + + public native int start(int port, int size); + + public native int stop(); +} diff --git a/forcetech/src/main/java/com/forcetech/service/P2PService.java b/forcetech/src/main/java/com/forcetech/service/P2PService.java new file mode 100644 index 000000000..827d9e624 --- /dev/null +++ b/forcetech/src/main/java/com/forcetech/service/P2PService.java @@ -0,0 +1,34 @@ +package com.forcetech.service; + +import android.app.Service; +import android.content.Intent; +import android.os.IBinder; + +import com.forcetech.Util; +import com.forcetech.android.ForceTV; +import com.gsoft.mitv.LocalBinder; + +public class P2PService extends Service { + + private ForceTV forceTV; + private IBinder binder; + + @Override + public void onCreate() { + super.onCreate(); + binder = new LocalBinder(); + } + + @Override + public IBinder onBind(Intent intent) { + forceTV = new ForceTV(); + forceTV.start(intent.getStringExtra("path"), Util.P2P); + return binder; + } + + @Override + public boolean onUnbind(Intent intent) { + if (forceTV != null) forceTV.stop(); + return super.onUnbind(intent); + } +} diff --git a/forcetech/src/main/java/com/forcetech/service/P3PService.java b/forcetech/src/main/java/com/forcetech/service/P3PService.java new file mode 100644 index 000000000..bccac570e --- /dev/null +++ b/forcetech/src/main/java/com/forcetech/service/P3PService.java @@ -0,0 +1,34 @@ +package com.forcetech.service; + +import android.app.Service; +import android.content.Intent; +import android.os.IBinder; + +import com.forcetech.Util; +import com.forcetech.android.ForceTV; +import com.gsoft.mitv.LocalBinder; + +public class P3PService extends Service { + + private ForceTV forceTV; + private IBinder binder; + + @Override + public void onCreate() { + super.onCreate(); + binder = new LocalBinder(); + } + + @Override + public IBinder onBind(Intent intent) { + forceTV = new ForceTV(); + forceTV.start(intent.getStringExtra("path"), Util.P3P); + return binder; + } + + @Override + public boolean onUnbind(Intent intent) { + if (forceTV != null) forceTV.stop(); + return super.onUnbind(intent); + } +} diff --git a/forcetech/src/main/java/com/forcetech/service/P4PService.java b/forcetech/src/main/java/com/forcetech/service/P4PService.java new file mode 100644 index 000000000..33069ecea --- /dev/null +++ b/forcetech/src/main/java/com/forcetech/service/P4PService.java @@ -0,0 +1,34 @@ +package com.forcetech.service; + +import android.app.Service; +import android.content.Intent; +import android.os.IBinder; + +import com.forcetech.Util; +import com.forcetech.android.ForceTV; +import com.gsoft.mitv.LocalBinder; + +public class P4PService extends Service { + + private ForceTV forceTV; + private IBinder binder; + + @Override + public void onCreate() { + super.onCreate(); + binder = new LocalBinder(); + } + + @Override + public IBinder onBind(Intent intent) { + forceTV = new ForceTV(); + forceTV.start(intent.getStringExtra("path"), Util.P4P); + return binder; + } + + @Override + public boolean onUnbind(Intent intent) { + if (forceTV != null) forceTV.stop(); + return super.onUnbind(intent); + } +} diff --git a/forcetech/src/main/java/com/forcetech/service/P5PService.java b/forcetech/src/main/java/com/forcetech/service/P5PService.java new file mode 100644 index 000000000..13065a55b --- /dev/null +++ b/forcetech/src/main/java/com/forcetech/service/P5PService.java @@ -0,0 +1,34 @@ +package com.forcetech.service; + +import android.app.Service; +import android.content.Intent; +import android.os.IBinder; + +import com.forcetech.Util; +import com.forcetech.android.ForceTV; +import com.gsoft.mitv.LocalBinder; + +public class P5PService extends Service { + + private ForceTV forceTV; + private IBinder binder; + + @Override + public void onCreate() { + super.onCreate(); + binder = new LocalBinder(); + } + + @Override + public IBinder onBind(Intent intent) { + forceTV = new ForceTV(); + forceTV.start(intent.getStringExtra("path"), Util.P5P); + return binder; + } + + @Override + public boolean onUnbind(Intent intent) { + if (forceTV != null) forceTV.stop(); + return super.onUnbind(intent); + } +} diff --git a/forcetech/src/main/java/com/forcetech/service/P6PService.java b/forcetech/src/main/java/com/forcetech/service/P6PService.java new file mode 100644 index 000000000..d31455e70 --- /dev/null +++ b/forcetech/src/main/java/com/forcetech/service/P6PService.java @@ -0,0 +1,34 @@ +package com.forcetech.service; + +import android.app.Service; +import android.content.Intent; +import android.os.IBinder; + +import com.forcetech.Util; +import com.forcetech.android.ForceTV; +import com.gsoft.mitv.LocalBinder; + +public class P6PService extends Service { + + private ForceTV forceTV; + private IBinder binder; + + @Override + public void onCreate() { + super.onCreate(); + binder = new LocalBinder(); + } + + @Override + public IBinder onBind(Intent intent) { + forceTV = new ForceTV(); + forceTV.start(intent.getStringExtra("path"), Util.P6P); + return binder; + } + + @Override + public boolean onUnbind(Intent intent) { + if (forceTV != null) forceTV.stop(); + return super.onUnbind(intent); + } +} diff --git a/forcetech/src/main/java/com/forcetech/service/P7PService.java b/forcetech/src/main/java/com/forcetech/service/P7PService.java new file mode 100644 index 000000000..a64317012 --- /dev/null +++ b/forcetech/src/main/java/com/forcetech/service/P7PService.java @@ -0,0 +1,34 @@ +package com.forcetech.service; + +import android.app.Service; +import android.content.Intent; +import android.os.IBinder; + +import com.forcetech.Util; +import com.forcetech.android.ForceTV; +import com.gsoft.mitv.LocalBinder; + +public class P7PService extends Service { + + private ForceTV forceTV; + private IBinder binder; + + @Override + public void onCreate() { + super.onCreate(); + binder = new LocalBinder(); + } + + @Override + public IBinder onBind(Intent intent) { + forceTV = new ForceTV(); + forceTV.start(intent.getStringExtra("path"), Util.P7P); + return binder; + } + + @Override + public boolean onUnbind(Intent intent) { + if (forceTV != null) forceTV.stop(); + return super.onUnbind(intent); + } +} diff --git a/forcetech/src/main/java/com/forcetech/service/P8PService.java b/forcetech/src/main/java/com/forcetech/service/P8PService.java new file mode 100644 index 000000000..5145374ae --- /dev/null +++ b/forcetech/src/main/java/com/forcetech/service/P8PService.java @@ -0,0 +1,34 @@ +package com.forcetech.service; + +import android.app.Service; +import android.content.Intent; +import android.os.IBinder; + +import com.forcetech.Util; +import com.forcetech.android.ForceTV; +import com.gsoft.mitv.LocalBinder; + +public class P8PService extends Service { + + private ForceTV forceTV; + private IBinder binder; + + @Override + public void onCreate() { + super.onCreate(); + binder = new LocalBinder(); + } + + @Override + public IBinder onBind(Intent intent) { + forceTV = new ForceTV(); + forceTV.start(intent.getStringExtra("path"), Util.P8P); + return binder; + } + + @Override + public boolean onUnbind(Intent intent) { + if (forceTV != null) forceTV.stop(); + return super.onUnbind(intent); + } +} diff --git a/forcetech/src/main/java/com/forcetech/service/P9PService.java b/forcetech/src/main/java/com/forcetech/service/P9PService.java new file mode 100644 index 000000000..b8871a7aa --- /dev/null +++ b/forcetech/src/main/java/com/forcetech/service/P9PService.java @@ -0,0 +1,34 @@ +package com.forcetech.service; + +import android.app.Service; +import android.content.Intent; +import android.os.IBinder; + +import com.forcetech.Util; +import com.forcetech.android.ForceTV; +import com.gsoft.mitv.LocalBinder; + +public class P9PService extends Service { + + private ForceTV forceTV; + private IBinder binder; + + @Override + public void onCreate() { + super.onCreate(); + binder = new LocalBinder(); + } + + @Override + public IBinder onBind(Intent intent) { + forceTV = new ForceTV(); + forceTV.start(intent.getStringExtra("path"), Util.P9P); + return binder; + } + + @Override + public boolean onUnbind(Intent intent) { + if (forceTV != null) forceTV.stop(); + return super.onUnbind(intent); + } +} diff --git a/forcetech/src/main/java/com/gsoft/mitv/MainActivity.java b/forcetech/src/main/java/com/gsoft/mitv/MainActivity.java index 2cc8210fc..e37c0db19 100644 --- a/forcetech/src/main/java/com/gsoft/mitv/MainActivity.java +++ b/forcetech/src/main/java/com/gsoft/mitv/MainActivity.java @@ -5,7 +5,7 @@ import android.content.Intent; import android.os.IBinder; import com.anymediacloud.iptv.standard.ForceTV; -import com.forcetech.Port; +import com.forcetech.Util; public class MainActivity extends Service { @@ -29,7 +29,7 @@ public class MainActivity extends Service { @Override public IBinder onBind(Intent intent) { forceTV = new ForceTV(); - forceTV.start(Port.MTV); + forceTV.start(Util.MTV); return binder; }