diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java index fcba30ed3..52ba05490 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java @@ -47,6 +47,7 @@ import com.fongmi.android.tv.impl.Callback; import com.fongmi.android.tv.model.SiteViewModel; import com.fongmi.android.tv.player.ExoUtil; import com.fongmi.android.tv.player.Players; +import com.fongmi.android.tv.player.source.Source; import com.fongmi.android.tv.ui.base.BaseActivity; import com.fongmi.android.tv.ui.custom.CustomKeyDownVod; import com.fongmi.android.tv.ui.custom.dialog.DescDialog; @@ -1221,6 +1222,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis @Override protected void onDestroy() { super.onDestroy(); + Source.stopAll(); mPlayers.release(); RefreshEvent.history(); App.removeCallbacks(mR1, mR2, mR3); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java index 81950f861..771e626a0 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java @@ -36,9 +36,7 @@ import com.fongmi.android.tv.impl.LiveCallback; import com.fongmi.android.tv.impl.PassCallback; import com.fongmi.android.tv.model.LiveViewModel; import com.fongmi.android.tv.player.Players; -import com.fongmi.android.tv.player.source.Force; -import com.fongmi.android.tv.player.source.TVBus; -import com.fongmi.android.tv.player.source.ZLive; +import com.fongmi.android.tv.player.source.Source; import com.fongmi.android.tv.ui.base.BaseActivity; import com.fongmi.android.tv.ui.custom.CustomKeyDownLive; import com.fongmi.android.tv.ui.custom.CustomLiveListView; @@ -806,10 +804,8 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick @Override protected void onDestroy() { super.onDestroy(); + Source.stopAll(); mPlayers.release(); - Force.get().stop(); - ZLive.get().stop(); - TVBus.get().stop(); App.removeCallbacks(mR1, mR2, mR3, mR4); } } diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Channel.java b/app/src/main/java/com/fongmi/android/tv/bean/Channel.java index 8797ee94c..51c1c7ae1 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Channel.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Channel.java @@ -1,6 +1,5 @@ package com.fongmi.android.tv.bean; -import android.net.Uri; import android.text.TextUtils; import android.view.View; import android.widget.ImageView; @@ -236,30 +235,6 @@ public class Channel { setLine(getUrls().indexOf(line)); } - public String getScheme() { - return Uri.parse(getCurrent()).getScheme().toLowerCase(); - } - - public boolean isForce() { - return getScheme().startsWith("p") || getScheme().equals("mitv"); - } - - public boolean isZLive() { - return getScheme().startsWith("zlive"); - } - - public boolean isTVBus() { - return getScheme().startsWith("tvbus"); - } - - public boolean isYoutube() { - return Uri.parse(getCurrent()).getHost().contains("youtube.com"); - } - - public boolean isBiliBili() { - return Uri.parse(getCurrent()).getHost().equals("live.bilibili.com"); - } - public Map getHeaders() { Map headers = Json.toMap(getHeader()); if (!getUa().isEmpty()) headers.put(HttpHeaders.USER_AGENT, getUa()); diff --git a/app/src/main/java/com/fongmi/android/tv/model/LiveViewModel.java b/app/src/main/java/com/fongmi/android/tv/model/LiveViewModel.java index f3315ebae..da4816eca 100644 --- a/app/src/main/java/com/fongmi/android/tv/model/LiveViewModel.java +++ b/app/src/main/java/com/fongmi/android/tv/model/LiveViewModel.java @@ -8,11 +8,7 @@ import com.fongmi.android.tv.api.LiveParser; import com.fongmi.android.tv.bean.Channel; import com.fongmi.android.tv.bean.Group; import com.fongmi.android.tv.bean.Live; -import com.fongmi.android.tv.player.source.BiliBili; -import com.fongmi.android.tv.player.source.Force; -import com.fongmi.android.tv.player.source.TVBus; -import com.fongmi.android.tv.player.source.Youtube; -import com.fongmi.android.tv.player.source.ZLive; +import com.fongmi.android.tv.player.source.Source; import java.util.Iterator; import java.util.concurrent.Callable; @@ -49,14 +45,8 @@ public class LiveViewModel extends ViewModel { public void fetch(Channel item) { execute(CHANNEL, () -> { - TVBus.get().stop(); - String url = item.getCurrent().split("\\$")[0]; - if (item.isForce()) item.setUrl(Force.get().fetch(url)); - else if (item.isZLive()) item.setUrl(ZLive.get().fetch(url)); - else if (item.isTVBus()) item.setUrl(TVBus.get().fetch(url)); - else if (item.isYoutube()) item.setUrl(Youtube.get().fetch(url)); - else if (item.isBiliBili()) item.setUrl(BiliBili.get().fetch(url)); - else item.setUrl(url); + Source.stop(); + item.setUrl(Source.getUrl(item.getCurrent().split("\\$")[0])); return item; }); } diff --git a/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java b/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java index 7d99425d5..3eac5127d 100644 --- a/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java +++ b/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java @@ -14,6 +14,7 @@ import com.fongmi.android.tv.api.ApiConfig; import com.fongmi.android.tv.bean.Result; import com.fongmi.android.tv.bean.Site; import com.fongmi.android.tv.bean.Vod; +import com.fongmi.android.tv.player.source.Source; import com.fongmi.android.tv.utils.ResUtil; import com.fongmi.android.tv.utils.Sniffer; import com.fongmi.android.tv.utils.Trans; @@ -135,6 +136,7 @@ public class SiteViewModel extends ViewModel { public void playerContent(String key, String flag, String id) { execute(player, () -> { + Source.stop(); Site site = ApiConfig.get().getSite(key); if (site.getType() == 3) { Spider spider = ApiConfig.get().getCSP(site); @@ -143,6 +145,7 @@ public class SiteViewModel extends ViewModel { ApiConfig.get().setRecent(site); Result result = Result.objectFrom(playerContent); if (result.getFlag().isEmpty()) result.setFlag(flag); + result.setUrl(Source.getUrl(result.getUrl())); result.setKey(key); return result; } else if (site.getType() == 4) { diff --git a/app/src/main/java/com/fongmi/android/tv/player/source/JianPian.java b/app/src/main/java/com/fongmi/android/tv/player/source/JianPian.java new file mode 100644 index 000000000..f804636bc --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/player/source/JianPian.java @@ -0,0 +1,70 @@ +package com.fongmi.android.tv.player.source; + +import android.net.Uri; + +import com.fongmi.android.tv.App; +import com.fongmi.android.tv.BuildConfig; +import com.fongmi.android.tv.utils.FileUtil; +import com.fongmi.android.tv.utils.Github; +import com.github.catvod.net.OkHttp; +import com.p2p.P2PClass; + +import java.io.File; +import java.net.URLDecoder; +import java.net.URLEncoder; + +public class JianPian { + + private P2PClass p2p; + private String url; + + private static class Loader { + static volatile JianPian INSTANCE = new JianPian(); + } + + public static JianPian get() { + return Loader.INSTANCE; + } + + private void init() throws Exception { + if (p2p != null) return; + String name = "libp2p-jp-" + BuildConfig.FLAVOR_abi + ".so"; + File file = FileUtil.getCacheFile(name); + String path = Github.get().getReleasePath("/other/jniLibs/" + file.getName()); + if (!file.exists()) FileUtil.write(file, OkHttp.newCall(path).execute().body().bytes()); + p2p = new P2PClass(App.get(), file.getAbsolutePath()); + } + + public String fetch(String text) throws Exception { + init(); + stop(); + set(text); + start(); + return "http://127.0.0.1:" + p2p.port + "/" + URLEncoder.encode(Uri.parse(url).getLastPathSegment(), "GBK"); + } + + private void set(String text) { + url = URLDecoder.decode(text).replace("tvbox-xg:", ""); + } + + private void start() { + try { + if (p2p == null || url == null) return; + p2p.P2Pdoxstart(url.getBytes("GBK")); + p2p.P2Pdoxadd(url.getBytes("GBK")); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void stop() { + try { + if (p2p == null || url == null) return; + p2p.P2Pdoxpause(url.getBytes("GBK")); + p2p.P2Pdoxdel(url.getBytes("GBK")); + url = null; + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/app/src/main/java/com/fongmi/android/tv/player/source/Source.java b/app/src/main/java/com/fongmi/android/tv/player/source/Source.java new file mode 100644 index 000000000..6eb97f844 --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/player/source/Source.java @@ -0,0 +1,65 @@ +package com.fongmi.android.tv.player.source; + +import android.net.Uri; + +public class Source { + + private static String getScheme(Uri uri) { + return uri.getScheme().toLowerCase(); + } + + private static boolean isHttp(Uri uri) { + return getScheme(uri).startsWith("http"); + } + + private static boolean isForce(Uri uri) { + return getScheme(uri).startsWith("p") || getScheme(uri).equals("mitv"); + } + + private static boolean isZLive(Uri uri) { + return getScheme(uri).startsWith("zlive"); + } + + private static boolean isTVBus(Uri uri) { + return getScheme(uri).startsWith("tvbus"); + } + + private static boolean isYoutube(Uri uri) { + return uri.getHost().contains("youtube.com"); + } + + private static boolean isBiliBili(Uri uri) { + return uri.getHost().equals("live.bilibili.com"); + } + + private static boolean isJianPian(Uri uri) { + return uri.getScheme().equals("tvbox-xg"); + } + + public static String getUrl(String url) throws Exception { + Uri uri = Uri.parse(url); + if (isHttp(uri)) { + if (isYoutube(uri)) return Youtube.get().fetch(url); + else if (isBiliBili(uri)) return BiliBili.get().fetch(url); + else return url; + } else { + if (isForce(uri)) return Force.get().fetch(url); + else if (isZLive(uri)) return ZLive.get().fetch(url); + else if (isTVBus(uri)) return TVBus.get().fetch(url); + else if (isJianPian(uri)) return JianPian.get().fetch(url); + else return url; + } + } + + public static void stop() { + TVBus.get().stop(); + JianPian.get().stop(); + } + + public static void stopAll() { + Force.get().stop(); + ZLive.get().stop(); + TVBus.get().stop(); + JianPian.get().stop(); + } +} diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java index 5e3e8baf7..8b7f3e2fd 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java @@ -50,6 +50,7 @@ import com.fongmi.android.tv.event.RefreshEvent; import com.fongmi.android.tv.model.SiteViewModel; import com.fongmi.android.tv.player.ExoUtil; import com.fongmi.android.tv.player.Players; +import com.fongmi.android.tv.player.source.Source; import com.fongmi.android.tv.receiver.PiPReceiver; import com.fongmi.android.tv.service.PlaybackService; import com.fongmi.android.tv.ui.adapter.EpisodeAdapter; @@ -1366,6 +1367,7 @@ public class DetailActivity extends BaseActivity implements Clock.Callback, Cust @Override protected void onDestroy() { super.onDestroy(); + Source.stopAll(); mPlayers.release(); Clock.get().release(); RefreshEvent.history(); diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java index 97b292db8..85103bf74 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java @@ -36,9 +36,7 @@ import com.fongmi.android.tv.impl.LiveCallback; import com.fongmi.android.tv.impl.PassCallback; import com.fongmi.android.tv.model.LiveViewModel; import com.fongmi.android.tv.player.Players; -import com.fongmi.android.tv.player.source.Force; -import com.fongmi.android.tv.player.source.TVBus; -import com.fongmi.android.tv.player.source.ZLive; +import com.fongmi.android.tv.player.source.Source; import com.fongmi.android.tv.receiver.PiPReceiver; import com.fongmi.android.tv.service.PlaybackService; import com.fongmi.android.tv.ui.adapter.ChannelAdapter; @@ -914,10 +912,8 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List @Override protected void onDestroy() { super.onDestroy(); + Source.stopAll(); mPlayers.release(); - Force.get().stop(); - ZLive.get().stop(); - TVBus.get().stop(); PlaybackService.stop(); App.removeCallbacks(mR1, mR2, mR3); } diff --git a/catvod/src/main/java/com/github/catvod/spider/Proxy.java b/catvod/src/main/java/com/github/catvod/spider/Proxy.java deleted file mode 100644 index 0b6ea8c41..000000000 --- a/catvod/src/main/java/com/github/catvod/spider/Proxy.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.github.catvod.spider; - -import com.github.catvod.net.OkHttp; - -public class Proxy { - - private static int port; - - static void adjustPort() throws Exception { - if (port > 0) return; - int port = 9978; - while (port < 10000) { - String resp = OkHttp.newCall("http://127.0.0.1:" + port + "/proxy?do=port").execute().body().string(); - if (resp.equals("ok")) { - Proxy.port = port; - break; - } - port++; - } - } - - public static String getUrl() { - try { - adjustPort(); - return "http://127.0.0.1:" + port + "/proxy"; - } catch (Exception e) { - return "http://127.0.0.1:9978/proxy"; - } - } -} diff --git a/drpy/src/main/java/com/hiker/drpy/Proxy.java b/drpy/src/main/java/com/hiker/drpy/Proxy.java new file mode 100644 index 000000000..acb4f4f6d --- /dev/null +++ b/drpy/src/main/java/com/hiker/drpy/Proxy.java @@ -0,0 +1,32 @@ +package com.hiker.drpy; + +import com.github.catvod.net.OkHttp; + +public class Proxy { + + private static int port; + + static void tryPort() { + if (port > 0) return; + int port = 9978; + while (port < 9999) { + boolean ok = string().equals("ok"); + if (ok) Proxy.port = port; + if (ok) break; + port++; + } + } + + private static String string() { + try { + return OkHttp.newCall("http://127.0.0.1:" + port + "/proxy?do=port").execute().body().string(); + } catch (Exception e) { + return ""; + } + } + + public static String getUrl() { + tryPort(); + return "http://127.0.0.1:" + port + "/proxy"; + } +} diff --git a/drpy/src/main/java/com/hiker/drpy/method/Global.java b/drpy/src/main/java/com/hiker/drpy/method/Global.java index be63d853c..b240b240c 100644 --- a/drpy/src/main/java/com/hiker/drpy/method/Global.java +++ b/drpy/src/main/java/com/hiker/drpy/method/Global.java @@ -6,7 +6,7 @@ import android.util.Base64; import androidx.annotation.Keep; import com.github.catvod.net.OkHttp; -import com.github.catvod.spider.Proxy; +import com.hiker.drpy.Proxy; import com.google.gson.Gson; import com.hiker.drpy.Parser; import com.whl.quickjs.wrapper.JSArray; diff --git a/jianpian/src/main/java/com/p2p/P2PClass.java b/jianpian/src/main/java/com/p2p/P2PClass.java index 1dad5e177..4c8cfb820 100644 --- a/jianpian/src/main/java/com/p2p/P2PClass.java +++ b/jianpian/src/main/java/com/p2p/P2PClass.java @@ -1,4 +1,175 @@ package com.p2p; +import android.content.Context; + +import java.io.File; + public class P2PClass { + + public String path; + public int port; + + public P2PClass(Context context, String so) { + System.load(so); + String cache = context.getCacheDir().getAbsolutePath(); + File file = new File(path = cache + "/jpali"); + if (!file.exists()) file.mkdirs(); + port = doxstarthttpd("TEST3E63BAAECDAA79BEAA91853490A69F08".getBytes(), cache.getBytes()); + } + + public int P2Pdoxstart(byte[] bArr) { + return doxstart(bArr); + } + + public int P2Pdoxdownload(byte[] bArr) { + return doxdownload(bArr); + } + + public int P2Pdoxterminate() { + return doxterminate(); + } + + public int P2Pdosetupload(int i) { + return dosetupload(i); + } + + public int P2Pdoxcheck(byte[] bArr) { + return doxcheck(bArr); + } + + public int P2Pdoxadd(byte[] bArr) { + return doxadd(bArr); + } + + public int P2Pdoxpause(byte[] bArr) { + return doxpause(bArr); + } + + public int P2Pdoxdel(byte[] bArr) { + return doxdel(bArr); + } + + public int P2PdoxdelAll() { + return doxdelall(); + } + + public long P2Pgetspeed(int i) { + return getspeed(i); + } + + public long P2Pgetdownsize(int i) { + return getdownsize(i); + } + + public long P2Pgetfilesize(int i) { + return getfilesize(i); + } + + public int P2Pgetpercent() { + return getpercent(); + } + + public long P2Pgetlocalfilesize(byte[] bArr) { + return getlocalfilesize(bArr); + } + + public long P2Pdosetduration(int i) { + return doxsetduration(i); + } + + public String getServiceAddress() { + return doxgethostbynamehook("xx0.github.com"); + } + + public int P2Pdoxstarthttpd(byte[] bArr, byte[] bArr2) { + return doxstarthttpd(bArr, bArr2); + } + + public int P2Pdoxsave() { + return doxsave(); + } + + public int P2Pdoxendhttpd() { + return doxendhttpd(); + } + + public String getVersion() { + return doxgetVersion(); + } + + public long xGFilmOpenFile(byte[] bArr) { + return XGFilmOpenFile(bArr); + } + + public void xGFilmCloseFile(long j) { + XGFilmCloseFile(j); + } + + public int xGFilmReadFile(long j, long j2, int i, byte[] bArr) { + return XGFilmReadFile(j, j2, i, bArr); + } + + public void setP2PPauseUpdate(int i) { + doxSetP2PPauseUpdate(i); + } + + public String getTouPingUrl() { + return doxgetlocalAddress(); + } + + public String P2Pdoxgettaskstat(int i) { + return doxgettaskstat(i); + } + + private native void XGFilmCloseFile(long j); + + private native long XGFilmOpenFile(byte[] bArr); + + private native int XGFilmReadFile(long j, long j2, int i, byte[] bArr); + + private native int dosetupload(int i); + + private native void doxSetP2PPauseUpdate(int i); + + private native int doxadd(byte[] bArr); + + private native int doxcheck(byte[] bArr); + + private native int doxdel(byte[] bArr); + + private native int doxdelall(); + + private native int doxdownload(byte[] bArr); + + private native int doxendhttpd(); + + private native String doxgetVersion(); + + private native String doxgethostbynamehook(String str); + + private native String doxgetlocalAddress(); + + private native String doxgettaskstat(int i); + + private native int doxpause(byte[] bArr); + + private native int doxsave(); + + private native int doxsetduration(int i); + + private native int doxstart(byte[] bArr); + + private native int doxstarthttpd(byte[] bArr, byte[] bArr2); + + private native int doxterminate(); + + private native long getdownsize(int i); + + private native long getfilesize(int i); + + private native long getlocalfilesize(byte[] bArr); + + private native int getpercent(); + + private native long getspeed(int i); }