From da4f21c76de5b7b2561fdb21daf5b9ec7c319edc Mon Sep 17 00:00:00 2001 From: 21561 <215613905@qq.com> Date: Sun, 6 Apr 2025 11:41:58 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E5=8E=86=E5=8F=B2=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E5=85=89=E6=A0=87=E8=BE=B9=E6=A1=86=E6=AE=8B=E7=95=99?= =?UTF-8?q?=E9=97=AE=E9=A2=98;=20=E5=8A=A0=E8=BD=BDjar=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E6=97=B6=E7=AB=8B=E9=A9=AC=E5=8A=A0=E8=BD=BD=E4=B8=8A=E4=B8=80?= =?UTF-8?q?=E6=AC=A1=E7=9A=84=E7=BC=93=E5=AD=98jar;=20=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E5=8F=8A=E6=92=AD=E6=94=BE=E9=A1=B5=E7=84=A6=E7=82=B9=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E5=86=8D=E6=AC=A1=E4=BC=98=E5=8C=96;=20=E8=A7=A3?= =?UTF-8?q?=E5=86=B3=E7=B1=BB=E4=BC=BC=E6=B5=B7=E8=B4=BC=E7=8E=8B=E8=B6=85?= =?UTF-8?q?=E9=95=BF=E5=89=A7=E9=9B=86=E6=BB=9A=E5=8A=A8=E7=9B=AE=E6=A0=87?= =?UTF-8?q?=E9=9B=86=E6=95=B0=E5=A4=B1=E8=B4=A5=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?;=20=E9=A6=96=E9=A1=B5=E5=A4=9A=E8=A1=8C=E5=8D=A1=E9=A1=BF?= =?UTF-8?q?=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96;=20=E8=A7=A3=E5=86=B3?= =?UTF-8?q?=E9=83=A8=E5=88=86=E7=94=B5=E5=BD=B1=E5=8E=BB=E5=B9=BF=E5=91=8A?= =?UTF-8?q?=E8=AF=AF=E6=9D=80=E7=9A=84=E9=97=AE=E9=A2=98;=20=E7=89=87?= =?UTF-8?q?=E5=A4=B4=E5=8F=AF=E6=8C=89=E9=81=A5=E6=8E=A7=E4=B8=8A=E4=B8=8B?= =?UTF-8?q?=E9=94=AE=E5=BE=AE=E8=B0=83;=20=E5=B0=9D=E8=AF=95=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=E7=BA=BF=E8=B7=AF=E8=BF=87=E5=A4=9A=E6=97=B6=E5=9B=A0?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=8E=92=E5=BA=8F=E5=AF=BC=E8=87=B4=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E8=BF=87=E6=85=A2=E7=9A=84=E9=97=AE=E9=A2=98;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 14 ++-- .../com/github/tvbox/osc/api/ApiConfig.java | 1 + .../com/github/tvbox/osc/bean/VodInfo.java | 4 +- .../osc/player/controller/VodController.java | 40 ++++++++- .../osc/ui/activity/CollectActivity.java | 2 +- .../tvbox/osc/ui/activity/DetailActivity.java | 67 ++++++++++++--- .../osc/ui/activity/HistoryActivity.java | 6 +- .../tvbox/osc/ui/activity/HomeActivity.java | 4 +- .../tvbox/osc/ui/adapter/HistoryAdapter.java | 29 ------- .../tvbox/osc/ui/fragment/UserFragment.java | 62 ++++++-------- .../java/com/github/tvbox/osc/util/M3u8.java | 83 +++++++++++++------ app/src/main/res/layout/activity_history.xml | 6 +- app/src/main/res/layout/fragment_user.xml | 28 +------ build.gradle | 2 +- pyramid/build.gradle | 4 +- 15 files changed, 199 insertions(+), 153 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 80618f72..5ec2f396 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -31,7 +31,7 @@ android { python { dimension "mode" // 配置Python打包特有的设置(如有需要) - minSdkVersion 16 + minSdkVersion 19 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro', 'proguard-python.pro' } } @@ -72,12 +72,12 @@ android { checkReleaseBuilds false abortOnError false } - dexOptions { - javaMaxHeapSize "4g" - additionalParameters += '--multi-dex' - additionalParameters += '--set-max-idx-number=48000' - additionalParameters += '--minimal-main-dex' - } +// dexOptions { +// javaMaxHeapSize "4g" +// additionalParameters += '--multi-dex' +// additionalParameters += '--set-max-idx-number=48000' +// additionalParameters += '--minimal-main-dex' +// } } repositories { diff --git a/app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java b/app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java index aeac3a5a..e64d8a1b 100644 --- a/app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java +++ b/app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java @@ -403,6 +403,7 @@ public class ApiConfig { if (ex != null) { LOG.i("echo---jar Request failed: " + ex.getMessage()); } + if(cache.exists())jarLoader.load(cache.getAbsolutePath()); callback.error("网络错误"); } }); diff --git a/app/src/main/java/com/github/tvbox/osc/bean/VodInfo.java b/app/src/main/java/com/github/tvbox/osc/bean/VodInfo.java index 2d15e38c..3d5ec4ae 100644 --- a/app/src/main/java/com/github/tvbox/osc/bean/VodInfo.java +++ b/app/src/main/java/com/github/tvbox/osc/bean/VodInfo.java @@ -86,7 +86,9 @@ public class VodInfo implements Serializable { for (VodSeriesFlag flag : seriesFlags) { List list = tempSeriesMap.get(flag.name); assert list != null; - if(isReverse(list))Collections.reverse(list); + if(seriesFlags.size()<=5){ + if(isReverse(list))Collections.reverse(list); + } seriesMap.put(flag.name, list); } } diff --git a/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java b/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java index 398d7ffa..a50ad94c 100644 --- a/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java +++ b/app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java @@ -1052,9 +1052,47 @@ public class VodController extends BaseController { private static final long LONG_PRESS_DELAY = 800; private boolean isLongPressTriggered = false; + private boolean setMinPlayTimeChange(String typeEt,boolean increase){ + myHandle.removeCallbacks(myRunnable); + myHandle.postDelayed(myRunnable, myHandleSeconds); + try { + int currentValue = mPlayerConfig.optInt(typeEt, 0); + if(currentValue!=0){ + int newValue = increase ? currentValue + 1 : currentValue - 1; + if(newValue < 0) { + newValue = 0; + } + mPlayerConfig.put(typeEt,newValue); + updatePlayerCfgView(); + listener.updatePlayerCfg(); + return true; + } + } catch (JSONException e) { + e.printStackTrace(); + } + return false; + } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { - if (isBottomVisible()) return super.onKeyDown(keyCode, event); + if (isBottomVisible()) { + if (keyCode == KeyEvent.KEYCODE_DPAD_UP ) { + if(mPlayerTimeStartBtn.hasFocus()){ + if(setMinPlayTimeChange("st",true)){ + return true; + } + } + View focusedView = mPlayBtnGroup.findFocus(); + if (focusedView instanceof TextView) { + return true; + } + } + if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN ) { + if(mPlayerTimeStartBtn.hasFocus()){ + if(setMinPlayTimeChange("st",false))return true; + } + } + return super.onKeyDown(keyCode, event); + } if (keyCode == KeyEvent.KEYCODE_DPAD_UP && event.getRepeatCount() == 0) { isLongPressTriggered = false; mLongPressRunnable = new Runnable() { diff --git a/app/src/main/java/com/github/tvbox/osc/ui/activity/CollectActivity.java b/app/src/main/java/com/github/tvbox/osc/ui/activity/CollectActivity.java index 9d591814..13111d50 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/activity/CollectActivity.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/activity/CollectActivity.java @@ -97,7 +97,7 @@ public class CollectActivity extends BaseActivity { @Override public void onItemSelected(TvRecyclerView parent, View itemView, int position) { - itemView.animate().scaleX(1.1f).scaleY(1.1f).setDuration(300).setInterpolator(new BounceInterpolator()).start(); + itemView.animate().scaleX(1.05f).scaleY(1.05f).setDuration(300).setInterpolator(new BounceInterpolator()).start(); } @Override diff --git a/app/src/main/java/com/github/tvbox/osc/ui/activity/DetailActivity.java b/app/src/main/java/com/github/tvbox/osc/ui/activity/DetailActivity.java index 26931de2..a8e15919 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/activity/DetailActivity.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/activity/DetailActivity.java @@ -4,10 +4,12 @@ import android.annotation.SuppressLint; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Color; +import android.graphics.PointF; import android.graphics.Rect; import android.os.Bundle; import android.text.Html; import android.text.TextUtils; +import android.util.DisplayMetrics; import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup; @@ -22,6 +24,7 @@ import android.content.ClipData; import androidx.fragment.app.FragmentContainerView; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.LinearSmoothScroller; import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.BaseViewHolder; @@ -131,6 +134,8 @@ public class DetailActivity extends BaseActivity { private int GroupCount; boolean showPreview = Hawk.get(HawkConfig.SHOW_PREVIEW, true);; // true 开启 false 关闭 + private LinearSmoothScroller smoothScroller; + @Override protected int getLayoutResID() { return R.layout.activity_detail; @@ -170,11 +175,22 @@ public class DetailActivity extends BaseActivity { tvQuickSearch = findViewById(R.id.tvQuickSearch); mEmptyPlayList = findViewById(R.id.mEmptyPlaylist); mGridView = findViewById(R.id.mGridView); - mGridView.setHasFixedSize(true); mGridView.setHasFixedSize(false); this.mGridViewLayoutMgr = new V7GridLayoutManager(this.mContext, 6); mGridView.setLayoutManager(this.mGridViewLayoutMgr); // mGridView.setLayoutManager(new V7LinearLayoutManager(this.mContext, 0, false)); + + smoothScroller = new LinearSmoothScroller(mContext) { + @Override + protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) { + return 100f / displayMetrics.densityDpi; + } + @Override + public PointF computeScrollVectorForPosition(int targetPosition) { + return mGridViewLayoutMgr.computeScrollVectorForPosition(targetPosition); + } + }; + seriesAdapter = new SeriesAdapter(this.mGridViewLayoutMgr); mGridView.setAdapter(seriesAdapter); mGridViewFlag = findViewById(R.id.mGridViewFlag); @@ -319,7 +335,8 @@ public class DetailActivity extends BaseActivity { firstReverse = !firstReverse; setSeriesGroupOptions(); seriesAdapter.notifyDataSetChanged(); - mGridView.smoothScrollToPosition(vodInfo.playIndex); + + customSeriesScrollPos(vodInfo.playIndex); if(currentSeriesGroupView != null) { TextView txtView = currentSeriesGroupView.findViewById(R.id.tvSeriesGroup); txtView.setTextColor(Color.WHITE); @@ -461,7 +478,8 @@ public class DetailActivity extends BaseActivity { txtView.setTextColor(mContext.getResources().getColor(R.color.color_02F8E1)); if (vodInfo != null && vodInfo.seriesMap.get(vodInfo.playFlag).size() > 0) { int targetPos = position * GroupCount; - mGridView.smoothScrollToPosition(targetPos); +// mGridView.smoothScrollToPosition(targetPos); + customSeriesScrollPos(targetPos); } currentSeriesGroupView = itemView; currentSeriesGroupView.isSelected(); @@ -470,6 +488,17 @@ public class DetailActivity extends BaseActivity { @Override public void onItemClick(TvRecyclerView parent, View itemView, int position) { } }); + tvSeriesSort.setOnFocusChangeListener((view, hasFocus) -> { + if (hasFocus) { + tvSeriesSort.setTextColor(mContext.getResources().getColor(R.color.color_02F8E1)); + if (vodInfo != null && Objects.requireNonNull(vodInfo.seriesMap.get(vodInfo.playFlag)).size() > 0) { +// mGridView.smoothScrollToPosition(vodInfo.playIndex); + customSeriesScrollPos(vodInfo.playIndex); + } + } else { + tvSeriesSort.setTextColor(Color.WHITE); + } + }); seriesGroupAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() { @Override public void onItemClick(BaseQuickAdapter adapter, View view, int position) { @@ -478,8 +507,8 @@ public class DetailActivity extends BaseActivity { newTxtView.setTextColor(mContext.getResources().getColor(R.color.color_02F8E1)); if (vodInfo != null && vodInfo.seriesMap.get(vodInfo.playFlag).size() > 0) { int targetPos = position * GroupCount+1; -// mGridView.scrollToPosition(targetPos); - mGridView.smoothScrollToPosition(targetPos); + + customSeriesScrollPos(targetPos); } if(currentSeriesGroupView != null) { TextView txtView = currentSeriesGroupView.findViewById(R.id.tvSeriesGroup); @@ -498,6 +527,17 @@ public class DetailActivity extends BaseActivity { setLoadSir(llLayout); } + //解决类似海贼王的超长动漫 焦点滚动失败的问题 + void customSeriesScrollPos(int targetPos) + { + mGridViewLayoutMgr.scrollToPositionWithOffset(targetPos>10?targetPos - 10:0, 0); + mGridView.postDelayed(() -> { + this.smoothScroller.setTargetPosition(targetPos); + mGridViewLayoutMgr.startSmoothScroll(smoothScroller); + mGridView.smoothScrollToPosition(targetPos); + }, 50); + } + private void initCheckedSourcesForSearch() { mCheckSources = SearchHelper.getSourcesForSearch(); } @@ -589,7 +629,8 @@ public class DetailActivity extends BaseActivity { mGridView.postDelayed(new Runnable() { @Override public void run() { - mGridView.smoothScrollToPosition(vodInfo.playIndex); +// mGridView.smoothScrollToPosition(vodInfo.playIndex); + customSeriesScrollPos(vodInfo.playIndex); } }, 100); } @@ -1040,11 +1081,15 @@ public class DetailActivity extends BaseActivity { tvSeriesGroup.setVisibility(fullWindows ? View.GONE : View.VISIBLE); //全屏下禁用详情页几个按键的焦点 防止上键跑过来 - tvPlay.setFocusable(!fullWindows); - tvDesc.setFocusable(!fullWindows); - tvCollect.setFocusable(!fullWindows); - tvQuickSearch.setFocusable(!fullWindows); - llPlayerFragmentContainerBlock.setFocusable(!fullWindows); +// tvPlay.setFocusable(!fullWindows); +// tvDesc.setFocusable(!fullWindows); +// tvCollect.setFocusable(!fullWindows); +// tvQuickSearch.setFocusable(!fullWindows); +// llPlayerFragmentContainerBlock.setFocusable(!fullWindows); +// mGridViewFlag.setFocusable(!fullWindows); +// tvSeriesSort.setFocusable(!fullWindows); +// mSeriesGroupView.setFocusable(!fullWindows); +// mGridView.setFocusable(!fullWindows); toggleSubtitleTextSize(); } diff --git a/app/src/main/java/com/github/tvbox/osc/ui/activity/HistoryActivity.java b/app/src/main/java/com/github/tvbox/osc/ui/activity/HistoryActivity.java index a752be26..d113b4af 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/activity/HistoryActivity.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/activity/HistoryActivity.java @@ -103,7 +103,7 @@ public class HistoryActivity extends BaseActivity { @Override public void onItemSelected(TvRecyclerView parent, View itemView, int position) { - itemView.animate().scaleX(1.1f).scaleY(1.1f).setDuration(300).setInterpolator(new BounceInterpolator()).start(); + itemView.animate().scaleX(1.05f).scaleY(1.05f).setDuration(300).setInterpolator(new BounceInterpolator()).start(); } @Override @@ -144,10 +144,6 @@ public class HistoryActivity extends BaseActivity { historyAdapter.setOnItemLongClickListener(new BaseQuickAdapter.OnItemLongClickListener() { @Override public boolean onItemLongClick(BaseQuickAdapter adapter, View view, int position) { -// FastClickCheckUtil.check(view); -// VodInfo vodInfo = historyAdapter.getData().get(position); -// historyAdapter.remove(position); -// RoomDataManger.deleteVodRecord(vodInfo.sourceKey, vodInfo); tvDelete.setFocusable(true); toggleDelMode(); return true; diff --git a/app/src/main/java/com/github/tvbox/osc/ui/activity/HomeActivity.java b/app/src/main/java/com/github/tvbox/osc/ui/activity/HomeActivity.java index 597b7bb0..ef4a1663 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/activity/HomeActivity.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/activity/HomeActivity.java @@ -514,9 +514,9 @@ public class HomeActivity extends BaseActivity { doExit(); return; } - } else if (baseLazyFragment instanceof UserFragment && UserFragment.tvHotList1.canScrollVertically(-1)) { + } else if (baseLazyFragment instanceof UserFragment && UserFragment.tvHotList.canScrollVertically(-1)) { // 如果 UserFragment 列表可以向上滚动,则滚动到顶部 - UserFragment.tvHotList1.scrollToPosition(0); + UserFragment.tvHotList.scrollToPosition(0); this.mGridView.setSelection(0); return; } else { diff --git a/app/src/main/java/com/github/tvbox/osc/ui/adapter/HistoryAdapter.java b/app/src/main/java/com/github/tvbox/osc/ui/adapter/HistoryAdapter.java index 8a89451c..d1d8038c 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/adapter/HistoryAdapter.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/adapter/HistoryAdapter.java @@ -35,7 +35,6 @@ public class HistoryAdapter extends BaseQuickAdapter { @Override protected void convert(BaseViewHolder helper, VodInfo item) { - // takagen99: Add Delete Mode FrameLayout tvDel = helper.getView(R.id.delFrameLayout); if (HawkConfig.hotVodDelete) { tvDel.setVisibility(View.VISIBLE); @@ -44,12 +43,6 @@ public class HistoryAdapter extends BaseQuickAdapter { } TextView tvYear = helper.getView(R.id.tvYear); - /*if (item.year <= 0) { - tvYear.setVisibility(View.GONE); - } else { - tvYear.setText(String.valueOf(item.year)); - tvYear.setVisibility(View.VISIBLE); - }*/ SourceBean bean = ApiConfig.get().getSource(item.sourceKey); if(bean!=null){ tvYear.setText(bean.getName()); @@ -57,28 +50,6 @@ public class HistoryAdapter extends BaseQuickAdapter { tvYear.setText("搜"); // tvYear.setVisibility(View.GONE); } - /*TextView tvLang = helper.getView(R.id.tvLang); - if (TextUtils.isEmpty(item.lang)) { - tvLang.setVisibility(View.GONE); - } else { - tvLang.setText(item.lang); - tvLang.setVisibility(View.VISIBLE); - } - TextView tvArea = helper.getView(R.id.tvArea); - if (TextUtils.isEmpty(item.area)) { - tvArea.setVisibility(View.GONE); - } else { - tvArea.setText(item.area); - tvArea.setVisibility(View.VISIBLE); - } - - TextView tvNote = helper.getView(R.id.tvNote); - if (TextUtils.isEmpty(item.note)) { - tvNote.setVisibility(View.GONE); - } else { - tvNote.setText(item.note); - tvNote.setVisibility(View.VISIBLE); - }*/ helper.setVisible(R.id.tvLang, false); helper.setVisible(R.id.tvArea, false); if (item.note == null || item.note.isEmpty()) { diff --git a/app/src/main/java/com/github/tvbox/osc/ui/fragment/UserFragment.java b/app/src/main/java/com/github/tvbox/osc/ui/fragment/UserFragment.java index 78bc697b..1c2be43d 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/fragment/UserFragment.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/fragment/UserFragment.java @@ -1,5 +1,6 @@ package com.github.tvbox.osc.ui.fragment; +import android.annotation.SuppressLint; import android.content.Intent; import android.os.Bundle; import android.view.View; @@ -62,8 +63,7 @@ public class UserFragment extends BaseLazyFragment implements View.OnClickListen private LinearLayout tvPush; public static HomeHotVodAdapter homeHotVodAdapter; private List homeSourceRec; - public static TvRecyclerView tvHotList1; - public static TvRecyclerView tvHotList2; + public static TvRecyclerView tvHotList; public static UserFragment newInstance() { return new UserFragment(); @@ -80,16 +80,25 @@ public class UserFragment extends BaseLazyFragment implements View.OnClickListen @Override protected void onFragmentResume() { - if(Hawk.get(HawkConfig.HOME_REC_STYLE, false)){ - tvHotList1.setVisibility(View.VISIBLE); - tvHotList2.setVisibility(View.GONE); - tvHotList1.setHasFixedSize(true); - tvHotList1.setLayoutManager(new V7GridLayoutManager(this.mContext, 5)); - }else { - tvHotList1.setVisibility(View.GONE); - tvHotList2.setVisibility(View.VISIBLE); - } super.onFragmentResume(); + if (Hawk.get(HawkConfig.HOME_REC_STYLE, false)) { + tvHotList.setVisibility(View.VISIBLE); + tvHotList.setHasFixedSize(true); + tvHotList.setLayoutManager(new V7GridLayoutManager(this.mContext, 5)); + int paddingLeft = getResources().getDimensionPixelSize(R.dimen.vs_15); + int paddingTop = getResources().getDimensionPixelSize(R.dimen.vs_10); + int paddingRight = getResources().getDimensionPixelSize(R.dimen.vs_15); + int paddingBottom = getResources().getDimensionPixelSize(R.dimen.vs_10); + tvHotList.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom); + } else { + tvHotList.setVisibility(View.VISIBLE); + tvHotList.setLayoutManager(new V7LinearLayoutManager(this.mContext, V7LinearLayoutManager.HORIZONTAL, false)); + int paddingLeft = getResources().getDimensionPixelSize(R.dimen.vs_15); + int paddingTop = getResources().getDimensionPixelSize(R.dimen.vs_40); + int paddingRight = getResources().getDimensionPixelSize(R.dimen.vs_15); + int paddingBottom = getResources().getDimensionPixelSize(R.dimen.vs_40); + tvHotList.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom); + } if (Hawk.get(HawkConfig.HOME_REC, 0) == 2) { List allVodRecord = RoomDataManger.getAllVodRecord(20); List vodList = new ArrayList<>(); @@ -144,8 +153,7 @@ public class UserFragment extends BaseLazyFragment implements View.OnClickListen tvHistory.setOnFocusChangeListener(focusChangeListener); tvPush.setOnFocusChangeListener(focusChangeListener); tvCollect.setOnFocusChangeListener(focusChangeListener); - tvHotList1 = findViewById(R.id.tvHotList1); - tvHotList2 = findViewById(R.id.tvHotList2); + tvHotList = findViewById(R.id.tvHotList); homeHotVodAdapter = new HomeHotVodAdapter(); homeHotVodAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() { @Override @@ -154,10 +162,10 @@ public class UserFragment extends BaseLazyFragment implements View.OnClickListen return; Movie.Video vod = ((Movie.Video) adapter.getItem(position)); - // takagen99: CHeck if in Delete Mode if ((vod.id != null && !vod.id.isEmpty()) && (Hawk.get(HawkConfig.HOME_REC, 0) == 2) && HawkConfig.hotVodDelete) { homeHotVodAdapter.remove(position); VodInfo vodInfo = RoomDataManger.getVodInfo(vod.sourceKey, vod.id); + assert vodInfo != null; RoomDataManger.deleteVodRecord(vod.sourceKey, vodInfo); Toast.makeText(mContext, "已删除当前记录", Toast.LENGTH_SHORT).show(); } else if (vod.id != null && !vod.id.isEmpty()) { @@ -176,13 +184,14 @@ public class UserFragment extends BaseLazyFragment implements View.OnClickListen } }); - // takagen99 : Long press to trigger Delete Mode for VOD History on Home Page homeHotVodAdapter.setOnItemLongClickListener(new BaseQuickAdapter.OnItemLongClickListener() { + @SuppressLint("NotifyDataSetChanged") @Override public boolean onItemLongClick(BaseQuickAdapter adapter, View view, int position) { if (ApiConfig.get().getSourceBeanList().isEmpty()) return false; Movie.Video vod = ((Movie.Video) adapter.getItem(position)); // Additional Check if : Home Rec 0=豆瓣, 1=推荐, 2=历史 + assert vod != null; if ((vod.id != null && !vod.id.isEmpty()) && (Hawk.get(HawkConfig.HOME_REC, 0) == 2)) { HawkConfig.hotVodDelete = !HawkConfig.hotVodDelete; homeHotVodAdapter.notifyDataSetChanged(); @@ -195,24 +204,7 @@ public class UserFragment extends BaseLazyFragment implements View.OnClickListen } }); - tvHotList1.setOnItemListener(new TvRecyclerView.OnItemListener() { - @Override - public void onItemPreSelected(TvRecyclerView parent, View itemView, int position) { - itemView.animate().scaleX(1.0f).scaleY(1.0f).setDuration(300).setInterpolator(new BounceInterpolator()).start(); - } - - @Override - public void onItemSelected(TvRecyclerView parent, View itemView, int position) { - itemView.animate().scaleX(1.05f).scaleY(1.05f).setDuration(300).setInterpolator(new BounceInterpolator()).start(); - } - - @Override - public void onItemClick(TvRecyclerView parent, View itemView, int position) { - - } - }); - tvHotList1.setAdapter(homeHotVodAdapter); - tvHotList2.setOnItemListener(new TvRecyclerView.OnItemListener() { + tvHotList.setOnItemListener(new TvRecyclerView.OnItemListener() { @Override public void onItemPreSelected(TvRecyclerView parent, View itemView, int position) { itemView.animate().scaleX(1.0f).scaleY(1.0f).setDuration(300).setInterpolator(new BounceInterpolator()).start(); @@ -228,7 +220,7 @@ public class UserFragment extends BaseLazyFragment implements View.OnClickListen } }); - tvHotList2.setAdapter(homeHotVodAdapter); + tvHotList.setAdapter(homeHotVodAdapter); initHomeHotVod(homeHotVodAdapter); } @@ -295,7 +287,7 @@ public class UserFragment extends BaseLazyFragment implements View.OnClickListen try { JsonObject infoJson = new Gson().fromJson(json, JsonObject.class); JsonArray array = infoJson.getAsJsonArray("data"); - int limit = Math.min(array.size(), 20); + int limit = Math.min(array.size(), 25); for (int i = 0; i < limit; i++) { // 改用索引循环 JsonElement ele = array.get(i); JsonObject obj = ele.getAsJsonObject(); diff --git a/app/src/main/java/com/github/tvbox/osc/util/M3u8.java b/app/src/main/java/com/github/tvbox/osc/util/M3u8.java index 2fa89009..913a442d 100644 --- a/app/src/main/java/com/github/tvbox/osc/util/M3u8.java +++ b/app/src/main/java/com/github/tvbox/osc/util/M3u8.java @@ -52,21 +52,20 @@ public class M3u8 { * @author asdfgh * asdfgh */ + + private static int timesNoAd = 10; //出现超过多少次的域名不认为是广告 private static String removeMinorityUrl(String tsUrlPre, String m3u8content) { String linesplit = "\n"; if (m3u8content.contains("\r\n")) linesplit = "\r\n"; String[] lines = m3u8content.split(linesplit); - HashMap preUrlMap = new HashMap<>(); - for (String line : lines) { - if (line.length() == 0 || line.charAt(0) == '#') { - continue; - } + HashMap preUrlMap = new HashMap(); + for (int i = 0; i < lines.length; i++) { + String line = lines[i]; + if (line.length() == 0 || line.charAt(0) == '#') continue; int ilast = line.lastIndexOf('.'); - if (ilast <= 4) { - continue; - } + if (ilast <= 4) continue; String preUrl = line.substring(0, ilast - 4); Integer cnt = preUrlMap.get(preUrl); if (cnt != null) { @@ -75,21 +74,17 @@ public class M3u8 { preUrlMap.put(preUrl, 1); } } + if (preUrlMap.size() <= 1) return null; if (maxPercent(preUrlMap) < 0.8) { - //尝试判断域名,取同域名最多的链接,其它域名当作广告去除 + // 用域名重建 preUrlMap preUrlMap.clear(); - for (String line : lines) { - if (line.length() == 0 || line.charAt(0) == '#') { - continue; - } - if (!line.startsWith("http://") && !line.startsWith("https://")) { - return null; - } - int ifirst = line.indexOf('/', 9);//skip http:// or https:// - if (ifirst <= 0) { - continue; - } + for (int i = 0; i < lines.length; i++) { + String line = lines[i]; + if (line.length() == 0 || line.charAt(0) == '#') continue; + if (!line.startsWith("http://") && !line.startsWith("https://")) return null; + int ifirst = line.indexOf('/', 9); + if (ifirst <= 0) continue; String preUrl = line.substring(0, ifirst); Integer cnt = preUrlMap.get(preUrl); if (cnt != null) { @@ -98,11 +93,21 @@ public class M3u8 { preUrlMap.put(preUrl, 1); } } + if (preUrlMap.size() <= 1) return null; - if (maxPercent(preUrlMap) < 0.8) { - return null; //视频非广告片断占比不够大 + + // 如果所有域名都超过timesNoAd条,说明没有广告,直接返回 null + boolean allExceed6 = true; + for (Map.Entry entry : preUrlMap.entrySet()) { + if (entry.getValue() <= timesNoAd) { + allExceed6 = false; + break; + } } + if (allExceed6) return null; } + + // 找出出现次数最多的域名前缀 int maxTimes = 0; String maxTimesPreUrl = ""; for (Map.Entry entry : preUrlMap.entrySet()) { @@ -127,25 +132,49 @@ public class M3u8 { if (!keyUrl.startsWith("http://") && !keyUrl.startsWith("https://")) { String newKeyUrl; if (keyUrl.charAt(0) == '/') { - int ifirst = tsUrlPre.indexOf('/', 9);//skip https://, http:// + int ifirst = tsUrlPre.indexOf('/', 9); newKeyUrl = tsUrlPre.substring(0, ifirst) + keyUrl; - } else + } else { newKeyUrl = tsUrlPre + keyUrl; + } lines[i] = lines[i].replace("URI=\"" + keyUrl + "\"", "URI=\"" + newKeyUrl + "\""); } dealedExtXKey = true; } } + if (lines[i].length() == 0 || lines[i].charAt(0) == '#') { continue; } - if (lines[i].startsWith(maxTimesPreUrl)) { + + boolean keep = false; + if (lines[i].startsWith("http://") || lines[i].startsWith("https://")) { + int ifirst = lines[i].indexOf('/', 9); + String domain; + if (ifirst > 0) { + domain = lines[i].substring(0, ifirst); + } else { + domain = lines[i]; + } + Integer count = preUrlMap.get(domain); + if (count != null && count > timesNoAd) { + keep = true; + } else if (domain.equals(maxTimesPreUrl)) { + keep = true; + } + } else { + // 相对路径默认保留 + keep = true; + } + + if (keep) { if (!lines[i].startsWith("http://") && !lines[i].startsWith("https://")) { if (lines[i].charAt(0) == '/') { - int ifirst = tsUrlPre.indexOf('/', 9);//skip https://, http:// + int ifirst = tsUrlPre.indexOf('/', 9); lines[i] = tsUrlPre.substring(0, ifirst) + lines[i]; - } else + } else { lines[i] = tsUrlPre + lines[i]; + } } } else { if (i > 0 && lines[i - 1].length() > 0 && lines[i - 1].charAt(0) == '#') { diff --git a/app/src/main/res/layout/activity_history.xml b/app/src/main/res/layout/activity_history.xml index c3f76904..af39be46 100644 --- a/app/src/main/res/layout/activity_history.xml +++ b/app/src/main/res/layout/activity_history.xml @@ -8,8 +8,6 @@ - + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_user.xml b/app/src/main/res/layout/fragment_user.xml index b57dcb34..0df29c87 100644 --- a/app/src/main/res/layout/fragment_user.xml +++ b/app/src/main/res/layout/fragment_user.xml @@ -258,38 +258,14 @@ - - - diff --git a/build.gradle b/build.gradle index 0360d7f6..62c192c9 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ buildscript { maven { url "https://chaquo.com/maven" } } dependencies { - classpath 'com.android.tools.build:gradle:4.2.2' + classpath 'com.android.tools.build:gradle:7.2.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/pyramid/build.gradle b/pyramid/build.gradle index 04e299c1..a77a7635 100644 --- a/pyramid/build.gradle +++ b/pyramid/build.gradle @@ -7,7 +7,7 @@ android { compileSdk 33 defaultConfig { - minSdkVersion 16 + minSdkVersion 19 targetSdkVersion 28 ndk { //abiFilters 'arm64-v8a' @@ -54,7 +54,7 @@ android { python.srcDirs = ["src/python"] } } - buildToolsVersion '30.0.2' + buildToolsVersion '30.0.3' } dependencies {