From 6525b1820bb98e4763b0e466e2263d7ebed56996 Mon Sep 17 00:00:00 2001 From: Harold Date: Wed, 18 Jan 2023 19:42:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81VLC=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/github/tvbox/osc/bean/MovieSort.java | 22 ++++++ .../osc/player/thirdparty/VlcPlayer.java | 76 +++++++++++++++++++ .../tvbox/osc/ui/activity/PlayActivity.java | 35 +++++---- .../tvbox/osc/ui/fragment/PlayFragment.java | 35 +++++---- .../github/tvbox/osc/util/PlayerHelper.java | 11 +++ 5 files changed, 149 insertions(+), 30 deletions(-) create mode 100644 app/src/main/java/com/github/tvbox/osc/player/thirdparty/VlcPlayer.java diff --git a/app/src/main/java/com/github/tvbox/osc/bean/MovieSort.java b/app/src/main/java/com/github/tvbox/osc/bean/MovieSort.java index 7f878891..c84433e4 100644 --- a/app/src/main/java/com/github/tvbox/osc/bean/MovieSort.java +++ b/app/src/main/java/com/github/tvbox/osc/bean/MovieSort.java @@ -59,12 +59,34 @@ public class MovieSort implements Serializable { public int compareTo(SortData o) { return this.sort - o.sort; } + + @Override + public String toString() { + return "SortData{" + + "id='" + id + '\'' + + ", name='" + name + '\'' + + ", sort=" + sort + + ", select=" + select + + ", filters=" + filters + + ", filterSelect=" + filterSelect + + ", flag='" + flag + '\'' + + '}'; + } } public static class SortFilter { public String key; public String name; public LinkedHashMap values; + + @Override + public String toString() { + return "SortFilter{" + + "key='" + key + '\'' + + ", name='" + name + '\'' + + ", values=" + values + + '}'; + } } } \ No newline at end of file diff --git a/app/src/main/java/com/github/tvbox/osc/player/thirdparty/VlcPlayer.java b/app/src/main/java/com/github/tvbox/osc/player/thirdparty/VlcPlayer.java new file mode 100644 index 00000000..7182bda8 --- /dev/null +++ b/app/src/main/java/com/github/tvbox/osc/player/thirdparty/VlcPlayer.java @@ -0,0 +1,76 @@ +package com.github.tvbox.osc.player.thirdparty; + +import android.app.Activity; +import android.content.ActivityNotFoundException; +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.util.Log; + +import com.github.tvbox.osc.base.App; + +public class VlcPlayer { + public static final String TAG = "ThirdParty.VLC"; + + private static final String PACKAGE_NAME = "org.videolan.vlc"; + private static final String PLAYBACK_ACTIVITY = "org.videolan.vlc.gui.video.VideoPlayerActivity"; + + private static class VlcPackageInfo { + final String packageName; + final String activityName; + + VlcPackageInfo(String packageName, String activityName) { + this.packageName = packageName; + this.activityName = activityName; + } + } + + private static final VlcPackageInfo[] PACKAGES = { + new VlcPackageInfo(PACKAGE_NAME, PLAYBACK_ACTIVITY), + }; + + public static VlcPackageInfo getPackageInfo() { + for (VlcPackageInfo pkg : PACKAGES) { + try { + ApplicationInfo info = App.getInstance().getPackageManager().getApplicationInfo(pkg.packageName, 0); + if (info.enabled) + return pkg; + else + Log.v(TAG, "VLC Player package `" + pkg.packageName + "` is disabled."); + } catch (PackageManager.NameNotFoundException ex) { + Log.v(TAG, "VLC Player package `" + pkg.packageName + "` does not exist."); + } + } + return null; + } + + public static boolean run(Activity activity, String url, String title, String subtitle, long progress) { + VlcPackageInfo packageInfo = getPackageInfo(); + if (packageInfo == null) + return false; + + // https://wiki.videolan.org/Android_Player_Intents/ + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setPackage(packageInfo.packageName); + intent.setDataAndTypeAndNormalize(Uri.parse(url), "video/*"); + intent.putExtra("title", title); + + if (subtitle != null && !subtitle.isEmpty()) { + intent.putExtra("subtitles_location", subtitle); + } + + if (progress > 0) { + intent.putExtra("from_start", false); + intent.putExtra("position", progress); + } + + try { + activity.startActivity(intent); + return true; + } catch (ActivityNotFoundException ex) { + Log.e(TAG, "Can't run VLC Player(Pro)", ex); + return false; + } + } +} diff --git a/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java b/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java index e078d390..f8fbb8c9 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java @@ -130,6 +130,23 @@ public class PlayActivity extends BaseActivity { initData(); } + public long getSavedProgress(String url) { + int st = 0; + try { + st = mVodPlayerCfg.getInt("st"); + } catch (JSONException e) { + e.printStackTrace(); + } + long skip = st * 1000; + if (CacheManager.getCache(MD5.string2MD5(url)) == null) { + return skip; + } + long rec = (long) CacheManager.getCache(MD5.string2MD5(url)); + if (rec < skip) + return skip; + return rec; + } + private void initView() { mHandler = new Handler(new Handler.Callback() { @Override @@ -160,20 +177,7 @@ public class PlayActivity extends BaseActivity { @Override public long getSavedProgress(String url) { - int st = 0; - try { - st = mVodPlayerCfg.getInt("st"); - } catch (JSONException e) { - e.printStackTrace(); - } - long skip = st * 1000; - if (CacheManager.getCache(MD5.string2MD5(url)) == null) { - return skip; - } - long rec = (long) CacheManager.getCache(MD5.string2MD5(url)); - if (rec < skip) - return skip; - return rec; + return PlayActivity.this.getSavedProgress(url); } }; mVideoView.setProgressManager(progressManager); @@ -510,7 +514,8 @@ public class PlayActivity extends BaseActivity { String playTitle = mVodInfo.name + " " + vs.name; setTip("调用外部播放器" + PlayerHelper.getPlayerName(playerType) + "进行播放", true, false); boolean callResult = false; - callResult = PlayerHelper.runExternalPlayer(playerType, PlayActivity.this, finalUrl, playTitle, playSubtitle, headers); + long progress = getSavedProgress(progressKey); + callResult = PlayerHelper.runExternalPlayer(playerType, PlayActivity.this, finalUrl, playTitle, playSubtitle, headers, progress); setTip("调用外部播放器" + PlayerHelper.getPlayerName(playerType) + (callResult ? "成功" : "失败"), callResult, !callResult); return; } diff --git a/app/src/main/java/com/github/tvbox/osc/ui/fragment/PlayFragment.java b/app/src/main/java/com/github/tvbox/osc/ui/fragment/PlayFragment.java index e65c1227..30b0c5ca 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/fragment/PlayFragment.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/fragment/PlayFragment.java @@ -139,6 +139,23 @@ public class PlayFragment extends BaseLazyFragment { initData(); } + public long getSavedProgress(String url) { + int st = 0; + try { + st = mVodPlayerCfg.getInt("st"); + } catch (JSONException e) { + e.printStackTrace(); + } + long skip = st * 1000; + if (CacheManager.getCache(MD5.string2MD5(url)) == null) { + return skip; + } + long rec = (long) CacheManager.getCache(MD5.string2MD5(url)); + if (rec < skip) + return skip; + return rec; + } + private void initView() { EventBus.getDefault().register(this); mHandler = new Handler(new Handler.Callback() { @@ -170,20 +187,7 @@ public class PlayFragment extends BaseLazyFragment { @Override public long getSavedProgress(String url) { - int st = 0; - try { - st = mVodPlayerCfg.getInt("st"); - } catch (JSONException e) { - e.printStackTrace(); - } - long skip = st * 1000; - if (CacheManager.getCache(MD5.string2MD5(url)) == null) { - return skip; - } - long rec = (long) CacheManager.getCache(MD5.string2MD5(url)); - if (rec < skip) - return skip; - return rec; + return PlayFragment.this.getSavedProgress(url); } }; mVideoView.setProgressManager(progressManager); @@ -519,7 +523,8 @@ public class PlayFragment extends BaseLazyFragment { String playTitle = mVodInfo.name + " " + vs.name; setTip("调用外部播放器" + PlayerHelper.getPlayerName(playerType) + "进行播放", true, false); boolean callResult = false; - callResult = PlayerHelper.runExternalPlayer(playerType, requireActivity(), finalUrl, playTitle, playSubtitle, headers); + long progress = getSavedProgress(progressKey); + callResult = PlayerHelper.runExternalPlayer(playerType, requireActivity(), finalUrl, playTitle, playSubtitle, headers, progress); setTip("调用外部播放器" + PlayerHelper.getPlayerName(playerType) + (callResult ? "成功" : "失败"), callResult, !callResult); return; } diff --git a/app/src/main/java/com/github/tvbox/osc/util/PlayerHelper.java b/app/src/main/java/com/github/tvbox/osc/util/PlayerHelper.java index 621df35e..f2912040 100644 --- a/app/src/main/java/com/github/tvbox/osc/util/PlayerHelper.java +++ b/app/src/main/java/com/github/tvbox/osc/util/PlayerHelper.java @@ -11,6 +11,7 @@ import com.github.tvbox.osc.player.thirdparty.Kodi; import com.github.tvbox.osc.player.thirdparty.MXPlayer; import com.github.tvbox.osc.player.thirdparty.ReexPlayer; import com.github.tvbox.osc.player.thirdparty.RemoteTVBox; +import com.github.tvbox.osc.player.thirdparty.VlcPlayer; import com.orhanobut.hawk.Hawk; import org.json.JSONException; @@ -167,6 +168,7 @@ public class PlayerHelper { playersInfo.put(11, "Reex播放器"); playersInfo.put(12, "Kodi播放器"); playersInfo.put(13, "附近TVBox"); + playersInfo.put(14, "VLC播放器"); mPlayersInfo = playersInfo; } return mPlayersInfo; @@ -183,6 +185,7 @@ public class PlayerHelper { playersExist.put(11, ReexPlayer.getPackageInfo() != null); playersExist.put(12, Kodi.getPackageInfo() != null); playersExist.put(13, RemoteTVBox.getAvalible() != null); + playersExist.put(14, VlcPlayer.getPackageInfo() != null); mPlayersExistInfo = playersExist; } return mPlayersExistInfo; @@ -209,6 +212,10 @@ public class PlayerHelper { } public static Boolean runExternalPlayer(int playerType, Activity activity, String url, String title, String subtitle, HashMap headers) { + return runExternalPlayer(playerType, activity, url, title, subtitle, headers); + } + + public static Boolean runExternalPlayer(int playerType, Activity activity, String url, String title, String subtitle, HashMap headers, long progress) { boolean callResult = false; switch (playerType) { case 10: { @@ -227,6 +234,10 @@ public class PlayerHelper { callResult = RemoteTVBox.run(activity, url, title, subtitle, headers); break; } + case 14: { + callResult = VlcPlayer.run(activity, url, title, subtitle, progress); + break; + } } return callResult; }