修正历史记录光标边框残留问题;

加载jar错误时立马加载上一次的缓存jar;
详情及播放页焦点问题再次优化;
解决类似海贼王超长剧集滚动目标集数失败的问题;
首页多行卡顿性能优化;
解决部分电影去广告误杀的问题;
片头可按遥控上下键微调;
尝试修正线路过多时因自动排序导致加载过慢的问题;
pull/144/head
21561 12 months ago
parent a4378dbcd9
commit da4f21c76d
  1. 14
      app/build.gradle
  2. 1
      app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java
  3. 4
      app/src/main/java/com/github/tvbox/osc/bean/VodInfo.java
  4. 40
      app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java
  5. 2
      app/src/main/java/com/github/tvbox/osc/ui/activity/CollectActivity.java
  6. 67
      app/src/main/java/com/github/tvbox/osc/ui/activity/DetailActivity.java
  7. 6
      app/src/main/java/com/github/tvbox/osc/ui/activity/HistoryActivity.java
  8. 4
      app/src/main/java/com/github/tvbox/osc/ui/activity/HomeActivity.java
  9. 29
      app/src/main/java/com/github/tvbox/osc/ui/adapter/HistoryAdapter.java
  10. 62
      app/src/main/java/com/github/tvbox/osc/ui/fragment/UserFragment.java
  11. 83
      app/src/main/java/com/github/tvbox/osc/util/M3u8.java
  12. 6
      app/src/main/res/layout/activity_history.xml
  13. 28
      app/src/main/res/layout/fragment_user.xml
  14. 2
      build.gradle
  15. 4
      pyramid/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 {

@ -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("网络错误");
}
});

@ -86,7 +86,9 @@ public class VodInfo implements Serializable {
for (VodSeriesFlag flag : seriesFlags) {
List<VodSeries> 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);
}
}

@ -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() {

@ -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

@ -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();
}

@ -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;

@ -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 {

@ -35,7 +35,6 @@ public class HistoryAdapter extends BaseQuickAdapter<VodInfo, BaseViewHolder> {
@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<VodInfo, BaseViewHolder> {
}
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<VodInfo, BaseViewHolder> {
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()) {

@ -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<Movie.Video> 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<VodInfo> allVodRecord = RoomDataManger.getAllVodRecord(20);
List<Movie.Video> 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();

@ -52,21 +52,20 @@ public class M3u8 {
* @author asdfgh
* <a href="https://github.com/asdfgh"> asdfgh </a>
*/
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<String, Integer> preUrlMap = new HashMap<>();
for (String line : lines) {
if (line.length() == 0 || line.charAt(0) == '#') {
continue;
}
HashMap<String, Integer> preUrlMap = new HashMap<String, Integer>();
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<String, Integer> entry : preUrlMap.entrySet()) {
if (entry.getValue() <= timesNoAd) {
allExceed6 = false;
break;
}
}
if (allExceed6) return null;
}
// 找出出现次数最多的域名前缀
int maxTimes = 0;
String maxTimesPreUrl = "";
for (Map.Entry<String, Integer> 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) == '#') {

@ -8,8 +8,6 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipChildren="false"
android:clipToPadding="false"
android:orientation="horizontal"
android:paddingLeft="@dimen/vs_50"
android:paddingTop="@dimen/vs_20"
@ -76,8 +74,6 @@
android:id="@+id/mGridView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false"
android:clipToPadding="false"
android:paddingLeft="@dimen/vs_60"
android:paddingTop="@dimen/vs_10"
android:paddingRight="@dimen/vs_60"
@ -85,4 +81,4 @@
app:tv_horizontalSpacingWithMargins="@dimen/vs_10"
app:tv_selectedItemIsCentered="true"
app:tv_verticalSpacingWithMargins="@dimen/vs_10" />
</LinearLayout>
</LinearLayout>

@ -258,38 +258,14 @@
</LinearLayout>
</LinearLayout>
<com.owen.tvrecyclerview.widget.TvRecyclerView
android:id="@+id/tvHotList1"
android:id="@+id/tvHotList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipChildren="false"
android:clipToPadding="false"
android:layout_below="@+id/tvUserHome"
android:paddingLeft="@dimen/vs_5"
android:paddingTop="@dimen/vs_40"
android:paddingRight="@dimen/vs_5"
android:paddingBottom="@dimen/vs_20"
app:tv_horizontalSpacingWithMargins="@dimen/vs_10"
app:tv_layoutManager="V7GridLayoutManager"
app:tv_selectedItemIsCentered="true"
app:tv_verticalSpacingWithMargins="@dimen/vs_10"
android:visibility="gone" />
<com.owen.tvrecyclerview.widget.TvRecyclerView
android:id="@+id/tvHotList2"
android:layout_width="match_parent"
android:layout_height="@dimen/vs_440"
android:clipChildren="false"
android:clipChildren="true"
android:clipToPadding="false"
android:layout_below="@+id/tvUserHome"
android:orientation="horizontal"
android:paddingLeft="@dimen/vs_5"
android:paddingTop="@dimen/vs_40"
android:paddingRight="@dimen/vs_5"
android:paddingBottom="@dimen/vs_40"
app:tv_horizontalSpacingWithMargins="@dimen/vs_10"
app:tv_layoutManager="V7LinearLayoutManager"
app:tv_selectedItemIsCentered="true"
app:tv_verticalSpacingWithMargins="@dimen/vs_10"
android:visibility="gone" />

@ -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

@ -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 {

Loading…
Cancel
Save