嗅探强制开启缓存增加ua支持;优化详情页;改分辨率时间随菜单栏显示;修正播放地址复制内容;再次优化倒序逻辑;支持alist爬虫

pull/39/head
于俊 4 years ago
parent ab16277159
commit 5aa5bab888
  1. 3
      .idea/misc.xml
  2. 15
      app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java
  3. 19
      app/src/main/java/com/github/tvbox/osc/ui/activity/DetailActivity.java
  4. 72
      app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java
  5. 45
      app/src/main/java/com/github/tvbox/osc/ui/fragment/PlayFragment.java
  6. 2
      app/src/main/java/com/github/tvbox/osc/util/PlayerHelper.java
  7. 2
      app/src/main/res/layout/activity_detail.xml
  8. 100
      app/src/main/res/layout/player_vod_control_view.xml

@ -12,13 +12,16 @@
<entry key="..\:/tvbox/TVBoxOS/app/src/main/layout/activity_live_play.xml" value="0.1" />
<entry key="..\:/tvbox/TVBoxOS/app/src/main/res/drawable/box_controller_top_bg.xml" value="0.2455" />
<entry key="..\:/tvbox/TVBoxOS/app/src/main/res/layout/activity_detail.xml" value="0.3619791666666667" />
<entry key="..\:/tvbox/TVBoxOS/app/src/main/res/layout/activity_home.xml" value="0.3619791666666667" />
<entry key="..\:/tvbox/TVBoxOS/app/src/main/res/layout/activity_live_play.xml" value="0.3369894099848714" />
<entry key="..\:/tvbox/TVBoxOS/app/src/main/res/layout/activity_play.xml" value="0.3619791666666667" />
<entry key="..\:/tvbox/TVBoxOS/app/src/main/res/layout/activity_search.xml" value="0.3619791666666667" />
<entry key="..\:/tvbox/TVBoxOS/app/src/main/res/layout/activity_setting.xml" value="0.3619791666666667" />
<entry key="..\:/tvbox/TVBoxOS/app/src/main/res/layout/box_vod_control_view.xml" value="0.3619791666666667" />
<entry key="..\:/tvbox/TVBoxOS/app/src/main/res/layout/dialog_quick_search.xml" value="0.18449694717281656" />
<entry key="..\:/tvbox/TVBoxOS/app/src/main/res/layout/fragment_model.xml" value="0.33" />
<entry key="..\:/tvbox/TVBoxOS/app/src/main/res/layout/item_channel_group_layout.xml" value="0.22826086956521738" />
<entry key="..\:/tvbox/TVBoxOS/app/src/main/res/layout/item_dialog_select.xml" value="0.3619791666666667" />
<entry key="..\:/tvbox/TVBoxOS/app/src/main/res/layout/item_live_channel_layout.xml" value="0.22826086956521738" />
<entry key="..\:/tvbox/TVBoxOS/app/src/main/res/layout/item_quick_search_lite.xml" value="0.3619791666666667" />
<entry key="..\:/tvbox/TVBoxOS/app/src/main/res/layout/loadsir_loading_layout.xml" value="0.3619791666666667" />

@ -58,11 +58,16 @@ public class VodController extends BaseController {
}
case 1002: { // 显示底部菜单
mBottomRoot.setVisibility(VISIBLE);
mTopRoot1.setVisibility(VISIBLE);
mTopRoot2.setVisibility(VISIBLE);
mPlayTitle.setVisibility(GONE);
mBottomRoot.requestFocus();
break;
}
case 1003: { // 隐藏底部菜单
mBottomRoot.setVisibility(GONE);
mTopRoot1.setVisibility(GONE);
mTopRoot2.setVisibility(GONE);
break;
}
case 1004: { // 设置速度
@ -90,9 +95,12 @@ public class VodController extends BaseController {
TextView mProgressText;
ImageView mProgressIcon;
LinearLayout mBottomRoot;
LinearLayout mTopRoot1;
LinearLayout mTopRoot2;
LinearLayout mParseRoot;
TvRecyclerView mGridView;
TextView mPlayTitle;
TextView mPlayTitle1;
TextView mNextBtn;
TextView mPreBtn;
TextView mPlayerScaleBtn;
@ -139,11 +147,14 @@ public class VodController extends BaseController {
mCurrentTime = findViewById(R.id.curr_time);
mTotalTime = findViewById(R.id.total_time);
mPlayTitle = findViewById(R.id.tv_info_name);
mPlayTitle1 = findViewById(R.id.tv_info_name1);
mSeekBar = findViewById(R.id.seekBar);
mProgressRoot = findViewById(R.id.tv_progress_container);
mProgressIcon = findViewById(R.id.tv_progress_icon);
mProgressText = findViewById(R.id.tv_progress_text);
mBottomRoot = findViewById(R.id.bottom_container);
mTopRoot1 = findViewById(R.id.tv_top_l_container);
mTopRoot2 = findViewById(R.id.tv_top_r_container);
mParseRoot = findViewById(R.id.parse_root);
mGridView = findViewById(R.id.mGridView);
mPlayerRetry = findViewById(R.id.play_retry);
@ -510,6 +521,7 @@ public class VodController extends BaseController {
public void setTitle(String playTitleInfo) {
mPlayTitle.setText(playTitleInfo);
mPlayTitle1.setText(playTitleInfo);
}
public void resetSpeed() {
@ -632,6 +644,9 @@ public class VodController extends BaseController {
startProgress();
break;
case VideoView.STATE_PAUSED:
mTopRoot1.setVisibility(GONE);
mTopRoot2.setVisibility(GONE);
mPlayTitle.setVisibility(VISIBLE);
break;
case VideoView.STATE_ERROR:
listener.errReplay();

@ -119,6 +119,7 @@ public class DetailActivity extends BaseActivity {
private View seriesFlagFocus = null;
private boolean isReverse;
private String preFlag="";
private boolean firstReverse;
private V7GridLayoutManager mGridViewLayoutMgr = null;
@Override
@ -162,7 +163,6 @@ public class DetailActivity extends BaseActivity {
mGridView.setHasFixedSize(false);
this.mGridViewLayoutMgr = new V7GridLayoutManager(this.mContext, isBaseOnWidth() ? 6 : 7);
mGridView.setLayoutManager(this.mGridViewLayoutMgr);
// mGridView.setLayoutManager(new V7GridLayoutManager(this.mContext, isBaseOnWidth() ? 6 : 7));
seriesAdapter = new SeriesAdapter();
mGridView.setAdapter(seriesAdapter);
mGridViewFlag = findViewById(R.id.mGridViewFlag);
@ -171,6 +171,7 @@ public class DetailActivity extends BaseActivity {
seriesFlagAdapter = new SeriesFlagAdapter();
mGridViewFlag.setAdapter(seriesFlagAdapter);
isReverse = false;
firstReverse = false;
if (showPreview) {
playFragment = new PlayFragment();
getSupportFragmentManager().beginTransaction().add(R.id.previewPlayer, playFragment).commit();
@ -186,7 +187,8 @@ public class DetailActivity extends BaseActivity {
isReverse = !isReverse;
vodInfo.reverse();
vodInfo.playIndex=(vodInfo.seriesMap.get(vodInfo.playFlag).size()-1)-vodInfo.playIndex;
insertVod(sourceKey, vodInfo);
// insertVod(sourceKey, vodInfo);
firstReverse = true;
seriesAdapter.notifyDataSetChanged();
}
}
@ -197,8 +199,9 @@ public class DetailActivity extends BaseActivity {
FastClickCheckUtil.check(v);
if (showPreview) {
toggleFullPreview();
if(isReverse){
if(firstReverse){
jumpToPlay();
firstReverse=false;
}
} else {
jumpToPlay();
@ -212,7 +215,7 @@ public class DetailActivity extends BaseActivity {
//获取剪切板管理器
ClipboardManager cm = (ClipboardManager)getSystemService(mContext.CLIPBOARD_SERVICE);
//设置内容到剪切板
cm.setPrimaryClip(ClipData.newPlainText(null, tvPlayUrl.getText().toString()));
cm.setPrimaryClip(ClipData.newPlainText(null, tvPlayUrl.getText().toString().replace("播放地址:","")));
Toast.makeText(DetailActivity.this, "已复制", Toast.LENGTH_SHORT).show();
}
});
@ -296,8 +299,6 @@ public class DetailActivity extends BaseActivity {
vodInfo.seriesMap.get(vodInfo.playFlag).get(vodInfo.playIndex).selected = false;
}
vodInfo.playFlag = newFlag;
//更新播放地址
setTextShow(tvPlayUrl, "播放地址:", vodInfo.seriesMap.get(vodInfo.playFlag).get(0).url);
seriesFlagAdapter.notifyItemChanged(position);
refreshList();
}
@ -348,7 +349,10 @@ public class DetailActivity extends BaseActivity {
seriesAdapter.notifyItemChanged(vodInfo.playIndex);
//选集全屏 想选集不全屏的注释下面一行
if (showPreview && !fullWindows) toggleFullPreview();
if (!showPreview || reload) jumpToPlay();
if (!showPreview || reload) {
jumpToPlay();
firstReverse=false;
}
}
}
});
@ -526,7 +530,6 @@ public class DetailActivity extends BaseActivity {
}
//设置播放地址
setTextShow(tvPlayUrl, "播放地址:", vodInfo.seriesMap.get(vodInfo.playFlag).get(0).url);
seriesFlagAdapter.setNewData(vodInfo.seriesFlags);
mGridViewFlag.scrollToPosition(flagScrollTo);

@ -287,6 +287,7 @@ public class PlayActivity extends BaseActivity {
String flag = info.optString("flag");
String url = info.getString("url");
HashMap<String, String> headers = null;
webUserAgent = null;
if (info.has("header")) {
try {
JSONObject hds = new JSONObject(info.getString("header"));
@ -297,6 +298,9 @@ public class PlayActivity extends BaseActivity {
headers = new HashMap<>();
}
headers.put(key, hds.getString(key));
if (key.equalsIgnoreCase("user-agent")) {
webUserAgent = hds.getString(key).trim();
}
}
} catch (Throwable th) {
@ -503,6 +507,7 @@ public class PlayActivity extends BaseActivity {
private String progressKey;
private String parseFlag;
private String webUrl;
private String webUserAgent;
private void initParse(String flag, boolean useParse, String playUrl, final String url) {
parseFlag = flag;
@ -823,23 +828,48 @@ public class PlayActivity extends BaseActivity {
}
}
void loadUrl(String url) {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (mXwalkWebView != null) {
mXwalkWebView.stopLoading();
mXwalkWebView.clearCache(true);
mXwalkWebView.loadUrl(url);
}
if (mSysWebView != null) {
mSysWebView.stopLoading();
mSysWebView.clearCache(true);
mSysWebView.loadUrl(url);
// void loadUrl(String url) {
// runOnUiThread(new Runnable() {
// @Override
// public void run() {
// if (mXwalkWebView != null) {
// mXwalkWebView.stopLoading();
// mXwalkWebView.clearCache(true);
// mXwalkWebView.loadUrl(url);
// }
// if (mSysWebView != null) {
// mSysWebView.stopLoading();
// mSysWebView.clearCache(true);
// mSysWebView.loadUrl(url);
// }
// }
// });
// }
void loadUrl(String url) {
runOnUiThread(new Runnable() {
@Override
public void run() {
// webUserAgent = "Mozilla/5.0 (Linux; Android 6.0.1; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Mobile Safari/537.36";
String ua = webUserAgent;
if (mXwalkWebView != null) {
mXwalkWebView.stopLoading();
if(ua != null) {
mXwalkWebView.getSettings().setUserAgentString(ua);
}
//mXwalkWebView.clearCache(true);
mXwalkWebView.loadUrl(url);
}
if (mSysWebView != null) {
mSysWebView.stopLoading();
if(ua != null) {
mSysWebView.getSettings().setUserAgentString(ua);
}
//mSysWebView.clearCache(true);
mSysWebView.loadUrl(url);
}
}
}
});
}
});
}
void stopLoadWebView(boolean destroy) {
runOnUiThread(new Runnable() {
@ -850,7 +880,7 @@ public class PlayActivity extends BaseActivity {
mXwalkWebView.stopLoading();
mXwalkWebView.loadUrl("about:blank");
if (destroy) {
mXwalkWebView.clearCache(true);
// mXwalkWebView.clearCache(true);
mXwalkWebView.removeAllViews();
mXwalkWebView.onDestroy();
mXwalkWebView = null;
@ -860,7 +890,7 @@ public class PlayActivity extends BaseActivity {
mSysWebView.stopLoading();
mSysWebView.loadUrl("about:blank");
if (destroy) {
mSysWebView.clearCache(true);
// mSysWebView.clearCache(true);
mSysWebView.removeAllViews();
mSysWebView.destroy();
mSysWebView = null;
@ -956,7 +986,8 @@ public class PlayActivity extends BaseActivity {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
// settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
/* 添加webView配置 */
//设置编码
settings.setDefaultTextEncodingName("utf-8");
@ -1116,7 +1147,8 @@ public class PlayActivity extends BaseActivity {
settings.setLoadWithOverviewMode(true);
settings.setBuiltInZoomControls(true);
settings.setSupportZoom(false);
settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
// settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
// settings.setUserAgentString(ANDROID_UA);
webView.setBackgroundColor(Color.BLACK);

@ -285,6 +285,7 @@ public class PlayFragment extends BaseLazyFragment {
String flag = info.optString("flag");
String url = info.getString("url");
HashMap<String, String> headers = null;
webUserAgent = null;
if (info.has("header")) {
try {
JSONObject hds = new JSONObject(info.getString("header"));
@ -295,6 +296,9 @@ public class PlayFragment extends BaseLazyFragment {
headers = new HashMap<>();
}
headers.put(key, hds.getString(key));
if (key.equalsIgnoreCase("user-agent")) {
webUserAgent = hds.getString(key).trim();
}
}
} catch (Throwable th) {
@ -515,6 +519,7 @@ public class PlayFragment extends BaseLazyFragment {
private String progressKey;
private String parseFlag;
private String webUrl;
private String webUserAgent;
private void initParse(String flag, boolean useParse, String playUrl, final String url) {
parseFlag = flag;
@ -836,18 +841,44 @@ public class PlayFragment extends BaseLazyFragment {
}
}
// void loadUrl(String url) {
// requireActivity().runOnUiThread(new Runnable() {
// @Override
// public void run() {
// if (mXwalkWebView != null) {
// mXwalkWebView.stopLoading();
// mXwalkWebView.clearCache(true);
// mXwalkWebView.loadUrl(url);
// }
// if (mSysWebView != null) {
// mSysWebView.stopLoading();
// mSysWebView.clearCache(true);
// mSysWebView.loadUrl(url);
// }
// }
// });
// }
void loadUrl(String url) {
requireActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
// webUserAgent = "Mozilla/5.0 (Linux; Android 6.0.1; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Mobile Safari/537.36";
String ua = webUserAgent;
if (mXwalkWebView != null) {
mXwalkWebView.stopLoading();
mXwalkWebView.clearCache(true);
if(ua != null) {
mXwalkWebView.getSettings().setUserAgentString(ua);
}
//mXwalkWebView.clearCache(true);
mXwalkWebView.loadUrl(url);
}
if (mSysWebView != null) {
mSysWebView.stopLoading();
mSysWebView.clearCache(true);
if(ua != null) {
mSysWebView.getSettings().setUserAgentString(ua);
}
//mSysWebView.clearCache(true);
mSysWebView.loadUrl(url);
}
}
@ -863,7 +894,7 @@ public class PlayFragment extends BaseLazyFragment {
mXwalkWebView.stopLoading();
mXwalkWebView.loadUrl("about:blank");
if (destroy) {
mXwalkWebView.clearCache(true);
// mXwalkWebView.clearCache(true);
mXwalkWebView.removeAllViews();
mXwalkWebView.onDestroy();
mXwalkWebView = null;
@ -873,7 +904,7 @@ public class PlayFragment extends BaseLazyFragment {
mSysWebView.stopLoading();
mSysWebView.loadUrl("about:blank");
if (destroy) {
mSysWebView.clearCache(true);
// mSysWebView.clearCache(true);
mSysWebView.removeAllViews();
mSysWebView.destroy();
mSysWebView = null;
@ -969,7 +1000,8 @@ public class PlayFragment extends BaseLazyFragment {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
// settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
/* 添加webView配置 */
//设置编码
settings.setDefaultTextEncodingName("utf-8");
@ -1129,7 +1161,8 @@ public class PlayFragment extends BaseLazyFragment {
settings.setLoadWithOverviewMode(true);
settings.setBuiltInZoomControls(true);
settings.setSupportZoom(false);
settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
// settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
// settings.setUserAgentString(ANDROID_UA);
webView.setBackgroundColor(Color.BLACK);

@ -191,6 +191,6 @@ public class PlayerHelper {
else if(speed > 1024)
return (speed / 1024) + "KB/s";
else
return speed + "B/s";
return speed > 0?speed + "B/s":"";
}
}

@ -154,7 +154,7 @@
android:layout_height="wrap_content"
android:ellipsize="end"
android:lineSpacingMultiplier="1.2"
android:maxLines="4"
android:maxLines="3"
android:textColor="@color/color_CCFFFFFF"
android:textSize="@dimen/ts_20" />

@ -5,6 +5,73 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/tv_top_l_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:tag="tv_top_container"
android:visibility="gone"
tools:visibility="visible"
android:layout_marginStart="@dimen/vs_20"
android:layout_marginLeft="@dimen/vs_20"
android:layout_marginTop="@dimen/vs_10"
android:orientation="vertical">
<TextView
android:id="@+id/tv_info_name1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:ellipsize="end"
android:singleLine="true"
android:width="680dp"
android:paddingTop="@dimen/vs_20"
android:paddingLeft="@dimen/vs_20"
android:text="http://"
android:textColor="@android:color/white"
android:textSize="@dimen/ts_24" />
<TextView
android:id="@+id/tv_videosize"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:ellipsize="end"
android:maxLines="1"
android:paddingLeft="@dimen/vs_20"
android:tag="vod_video_size"
android:text="[ 1024 x 768 ]"
android:textColor="@android:color/white"
android:textSize="@dimen/ts_24" />
</LinearLayout>
<LinearLayout
android:id="@+id/tv_top_r_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:tag="tv_top_container"
android:visibility="gone"
tools:visibility="visible"
android:layout_gravity="right"
android:layout_marginStart="@dimen/vs_20"
android:layout_marginLeft="@dimen/vs_20"
android:layout_marginTop="@dimen/vs_10"
android:orientation="vertical">
<TextView
android:id="@+id/tv_sys_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:ellipsize="end"
android:maxLines="1"
android:padding="@dimen/vs_20"
android:tag="vod_control_pause_time"
android:text="00:00:00"
android:textColor="@android:color/white"
android:textSize="@dimen/ts_24" />
</LinearLayout>
<LinearLayout
android:id="@+id/bottom_container"
android:layout_width="match_parent"
@ -307,46 +374,15 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:maxLines="2"
android:ellipsize="end"
android:maxLines="1"
android:paddingTop="@dimen/vs_20"
android:paddingLeft="@dimen/vs_20"
android:text="http://"
android:textColor="@android:color/white"
android:textSize="@dimen/ts_24" />
<TextView
android:id="@+id/tv_videosize"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:ellipsize="end"
android:maxLines="1"
android:paddingLeft="@dimen/vs_20"
android:tag="vod_video_size"
android:text="[ 1024 x 768 ]"
android:textColor="@android:color/white"
android:textSize="@dimen/ts_24" />
</LinearLayout>
<TextView
android:id="@+id/tv_sys_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/vs_20"
android:layout_marginRight="@dimen/vs_20"
android:layout_marginTop="@dimen/vs_10"
android:layout_gravity="right"
android:ellipsize="end"
android:maxLines="1"
android:padding="@dimen/vs_20"
android:tag="vod_control_pause_time"
android:text="00:00:00"
android:textColor="@android:color/white"
android:textSize="@dimen/ts_24" />
<LinearLayout
android:layout_width="@dimen/vs_280"
android:layout_height="@dimen/vs_200"

Loading…
Cancel
Save