规则rules配置兼容script{"name": "剧圈圈","hosts": ["jqqzx"],"script": ["document.getElementById('playleft').children[0].contentWindow.document.getElementById('start').click()"]}

优化搜索历史;
main
jun 11 months ago
parent 0d5c25aa17
commit acd8a217e1
  1. 16
      app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java
  2. 38
      app/src/main/java/com/github/tvbox/osc/player/controller/VodController.java
  3. 39
      app/src/main/java/com/github/tvbox/osc/ui/activity/FastSearchActivity.java
  4. 23
      app/src/main/java/com/github/tvbox/osc/ui/activity/PlayActivity.java
  5. 8
      app/src/main/java/com/github/tvbox/osc/ui/activity/SearchActivity.java
  6. 30
      app/src/main/java/com/github/tvbox/osc/ui/fragment/PlayFragment.java
  7. 21
      app/src/main/java/com/github/tvbox/osc/util/HistoryHelper.java
  8. 25
      app/src/main/java/com/github/tvbox/osc/util/VideoParseRuler.java

@ -549,6 +549,7 @@ public class ApiConfig {
VideoParseRuler.clearRule();
for(JsonElement oneHostRule : infoJson.getAsJsonArray("rules")) {
JsonObject obj = (JsonObject) oneHostRule;
//嗅探过滤规则
if (obj.has("host")) {
String host = obj.get("host").getAsString();
if (obj.has("rule")) {
@ -574,6 +575,7 @@ public class ApiConfig {
}
}
}
//广告过滤规则
if (obj.has("hosts") && obj.has("regex")) {
ArrayList<String> rule = new ArrayList<>();
ArrayList<String> ads = new ArrayList<>();
@ -590,6 +592,20 @@ public class ApiConfig {
VideoParseRuler.addHostRegex(host, ads);
}
}
//嗅探脚本规则 如 click
if (obj.has("hosts") && obj.has("script")) {
ArrayList<String> scripts = new ArrayList<>();
JsonArray scriptArray = obj.getAsJsonArray("script");
for (JsonElement one : scriptArray) {
String script = one.getAsString();
scripts.add(script);
}
JsonArray array = obj.getAsJsonArray("hosts");
for (JsonElement one : array) {
String host = one.getAsString();
VideoParseRuler.addHostScript(host, scripts);
}
}
}
}

@ -4,11 +4,13 @@ import android.app.Activity;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.os.Build;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.webkit.WebView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.SeekBar;
@ -23,6 +25,7 @@ import com.github.tvbox.osc.R;
import com.github.tvbox.osc.api.ApiConfig;
import com.github.tvbox.osc.bean.IJKCode;
import com.github.tvbox.osc.bean.ParseBean;
import com.github.tvbox.osc.bean.SourceBean;
import com.github.tvbox.osc.server.ControlManager;
import com.github.tvbox.osc.server.RemoteServer;
import com.github.tvbox.osc.subtitle.widget.SimpleSubtitleView;
@ -36,6 +39,7 @@ import com.github.tvbox.osc.util.M3u8;
import com.github.tvbox.osc.util.PlayerHelper;
import com.github.tvbox.osc.util.ScreenUtils;
import com.github.tvbox.osc.util.SubtitleHelper;
import com.github.tvbox.osc.util.VideoParseRuler;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.callback.AbsCallback;
import com.lzy.okgo.model.HttpHeaders;
@ -48,6 +52,7 @@ import org.jetbrains.annotations.NotNull;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.xwalk.core.XWalkView;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
@ -1362,4 +1367,37 @@ public class VodController extends BaseController {
}
return url;
}
public void evaluateScript(SourceBean sourceBean,String url, WebView web_view, XWalkView xWalk_view){
String clickSelector = sourceBean.getClickSelector().trim();
clickSelector=clickSelector.isEmpty()?VideoParseRuler.getHostScript(url):clickSelector;
if (!clickSelector.isEmpty()) {
String selector;
if (clickSelector.contains(";") && !clickSelector.endsWith(";")) {
String[] parts = clickSelector.split(";", 2);
if (!url.contains(parts[0])) {
return;
}
selector = parts[1].trim();
} else {
selector = clickSelector.trim();
}
// 构造点击的 JS 代码
String js = selector;
// if(!selector.contains("click()"))js+=".click();";
LOG.i("echo-javascript:" + js);
if(web_view!=null){
//4.4以上才支持这种写法
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
web_view.evaluateJavascript(js, null);
} else {
web_view.loadUrl("javascript:" + js);
}
}
if(xWalk_view!=null){
//4.0+开始全部支持这种写法
xWalk_view.evaluateJavascript(js, null);
}
}
}
}

@ -26,11 +26,10 @@ import com.github.tvbox.osc.ui.adapter.FastListAdapter;
import com.github.tvbox.osc.ui.adapter.FastSearchAdapter;
import com.github.tvbox.osc.ui.adapter.SearchWordAdapter;
import com.github.tvbox.osc.util.FastClickCheckUtil;
import com.github.tvbox.osc.util.HawkConfig;
import com.github.tvbox.osc.util.HistoryHelper;
import com.github.tvbox.osc.util.SearchHelper;
import com.github.tvbox.osc.viewmodel.SourceViewModel;
import com.lzy.okgo.OkGo;
import com.orhanobut.hawk.Hawk;
import com.owen.tvrecyclerview.widget.TvRecyclerView;
import com.owen.tvrecyclerview.widget.V7GridLayoutManager;
import com.owen.tvrecyclerview.widget.V7LinearLayoutManager;
@ -60,12 +59,7 @@ public class FastSearchActivity extends BaseActivity {
private TvRecyclerView mGridViewWord;
private TvRecyclerView mGridViewWordFenci;
SourceViewModel sourceViewModel;
// private EditText etSearch;
// private TextView tvSearch;
// private TextView tvClear;
// private SearchKeyboard keyboard;
// private TextView tvAddress;
// private ImageView ivQRCode;
private SearchWordAdapter searchWordAdapter;
private FastSearchAdapter searchAdapter;
private FastSearchAdapter searchAdapterFilter;
@ -75,10 +69,10 @@ public class FastSearchActivity extends BaseActivity {
private boolean isFilterMode = false;
private String searchFilterKey = ""; // 过滤的key
private HashMap<String, ArrayList<Movie.Video>> resultVods; // 搜索结果
private List<String> quickSearchWord = new ArrayList<>();
private final List<String> quickSearchWord = new ArrayList<>();
private HashMap<String, String> mCheckSources = null;
private View.OnFocusChangeListener focusChangeListener = new View.OnFocusChangeListener() {
private final View.OnFocusChangeListener focusChangeListener = new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View itemView, boolean hasFocus) {
try {
@ -141,13 +135,6 @@ public class FastSearchActivity extends BaseActivity {
spListAdapter = new FastListAdapter();
mGridViewWord.setAdapter(spListAdapter);
// mGridViewWord.setFocusable(true);
// mGridViewWord.setOnFocusChangeListener(new View.OnFocusChangeListener() {
// @Override
// public void onFocusChange(View itemView, boolean hasFocus) {}
// });
mGridViewWord.addOnChildAttachStateChangeListener(new RecyclerView.OnChildAttachStateChangeListener() {
@Override
public void onChildViewAttachedToWindow(@NonNull View child) {
@ -157,9 +144,6 @@ public class FastSearchActivity extends BaseActivity {
if (t.getText() == "全部") {
t.requestFocus();
}
// if (child.isFocusable() && null == child.getOnFocusChangeListener()) {
// child.setOnFocusChangeListener(focusChangeListener);
// }
}
@Override
@ -254,7 +238,7 @@ public class FastSearchActivity extends BaseActivity {
}
private void filterResult(String spName) {
if (spName == "全部") {
if (spName.equals("全部")) {
mGridView.setVisibility(View.VISIBLE);
mGridViewFilter.setVisibility(View.GONE);
return;
@ -372,18 +356,13 @@ public class FastSearchActivity extends BaseActivity {
spNames.clear();
//写入历史记录
ArrayList<String> history = Hawk.get(HawkConfig.SEARCH_HISTORY, new ArrayList<String>());
if (!history.contains(title))
history.add(0, title);
if (history.size() > 10)
history.remove(10);
Hawk.put(HawkConfig.SEARCH_HISTORY, history);
HistoryHelper.setSearchHistory(title);
searchResult();
}
private ExecutorService searchExecutorService = null;
private AtomicInteger allRunCount = new AtomicInteger(0);
private final AtomicInteger allRunCount = new AtomicInteger(0);
private void searchResult() {
try {
@ -471,7 +450,7 @@ public class FastSearchActivity extends BaseActivity {
for(String one : arr) {
if (name.contains(one)) matchNum++;
}
return matchNum == arr.length ? true : false;
return matchNum == arr.length;
}
private void searchData(AbsXml absXml) {
@ -503,7 +482,7 @@ public class FastSearchActivity extends BaseActivity {
int count = allRunCount.decrementAndGet();
if (count <= 0) {
if (searchAdapter.getData().size() <= 0) {
if (searchAdapter.getData().size() == 0) {
showEmpty();
}
cancel();

@ -1616,24 +1616,9 @@ public class PlayActivity extends BaseActivity {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view,url);
String click=sourceBean.getClickSelector().trim();
LOG.i("echo-onPageFinished url:" + url);
if(!click.isEmpty()){
String selector;
if(click.contains(";") && !click.endsWith(";")){
if(!url.contains(click.split(";")[0]))return;
selector=click.split(";")[1];
}else {
selector=click;
}
String js = selector;
if(!selector.contains("click()"))js+=".click();";
LOG.i("echo-javascript:" + js);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
view.evaluateJavascript(js, null);
} else {
view.loadUrl("javascript:" + js);
}
if(!url.equals("about:blank")){
mController.evaluateScript(sourceBean,url,view,null);
}
}
@ -1800,6 +1785,10 @@ public class PlayActivity extends BaseActivity {
@Override
public void onLoadFinished(XWalkView view, String url) {
super.onLoadFinished(view, url);
LOG.i("echo-onPageFinished url:" + url);
if(!url.equals("about:blank")){
mController.evaluateScript(sourceBean,url,null,view);
}
}
@Override

@ -35,6 +35,7 @@ import com.github.tvbox.osc.ui.dialog.SearchCheckboxDialog;
import com.github.tvbox.osc.ui.tv.widget.SearchKeyboard;
import com.github.tvbox.osc.util.FastClickCheckUtil;
import com.github.tvbox.osc.util.HawkConfig;
import com.github.tvbox.osc.util.HistoryHelper;
import com.github.tvbox.osc.util.SearchHelper;
import com.github.tvbox.osc.viewmodel.SourceViewModel;
import com.google.gson.Gson;
@ -477,12 +478,7 @@ public class SearchActivity extends BaseActivity {
etSearch.setText(title);
//写入历史记录
ArrayList<String> history = Hawk.get(HawkConfig.SEARCH_HISTORY, new ArrayList<String>());
if (!history.contains(title))
history.add(0, title);
if (history.size() > 10)
history.remove(10);
Hawk.put(HawkConfig.SEARCH_HISTORY, history);
HistoryHelper.setSearchHistory(title);
this.searchTitle = title;

@ -1430,7 +1430,7 @@ public class PlayFragment extends BaseLazyFragment {
XWalkUtils.tryUseXWalk(mContext, new XWalkUtils.XWalkState() {
@Override
public void success() {
initWebView(!sourceBean.getClickSelector().isEmpty());
initWebView(false);
loadUrl(url);
}
@ -1687,29 +1687,9 @@ public class PlayFragment extends BaseLazyFragment {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
String clickSelector = sourceBean.getClickSelector().trim();
LOG.i("echo-onPageFinished url:" + url);
if (!clickSelector.isEmpty()) {
String selector;
if (clickSelector.contains(";") && !clickSelector.endsWith(";")) {
String[] parts = clickSelector.split(";", 2);
if (!url.contains(parts[0])) {
return;
}
selector = parts[1].trim();
} else {
selector = clickSelector.trim();
}
// selector="document.getElementById('playleft').children[0].contentWindow.document.getElementById('start')";
// 构造点击的 JS 代码
String js = selector;
if(!selector.contains("click()"))js+=".click();";
LOG.i("echo-javascript:" + js);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
view.evaluateJavascript(js, null);
} else {
view.loadUrl("javascript:" + js);
}
if(!url.equals("about:blank")){
mController.evaluateScript(sourceBean,url,view,null);
}
}
@ -1878,6 +1858,10 @@ public class PlayFragment extends BaseLazyFragment {
@Override
public void onLoadFinished(XWalkView view, String url) {
super.onLoadFinished(view, url);
LOG.i("echo-onLoadFinished url:" + url);
if(!url.equals("about:blank")){
mController.evaluateScript(sourceBean,url,null,view);
}
}
@Override

@ -1,14 +1,17 @@
package com.github.tvbox.osc.util;
import com.orhanobut.hawk.Hawk;
import java.util.ArrayList;
public class HistoryHelper {
private static Integer[] hisNumArray = {30,50,100};
private static final Integer[] hisNumArray = {30,50,100};
public static final String getHistoryNumName(int index){
public static String getHistoryNumName(int index){
Integer value = getHisNum(index);
return value + "条";
}
public static final int getHisNum(int index){
public static int getHisNum(int index){
Integer value = null;
if(index>=0 && index < hisNumArray.length){
value = hisNumArray[index];
@ -17,4 +20,16 @@ public class HistoryHelper {
}
return value;
}
public static void setSearchHistory(String title){
// 读取历史记录
ArrayList<String> history = Hawk.get(HawkConfig.SEARCH_HISTORY, new ArrayList<String>());
history.remove(title);
history.add(0, title);
// 保证最多只保留 15 条,超过的就删除最后一条
if (history.size() > 15) {
history.remove(history.size() - 1);
}
Hawk.put(HawkConfig.SEARCH_HISTORY, history);
}
}

@ -5,6 +5,8 @@ import static com.github.tvbox.osc.util.RegexUtils.getPattern;
import android.net.Uri;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
public class VideoParseRuler {
@ -12,11 +14,13 @@ public class VideoParseRuler {
private static final HashMap<String, ArrayList<ArrayList<String>>> HOSTS_RULE = new HashMap<>();
private static final HashMap<String, ArrayList<ArrayList<String>>> HOSTS_FILTER = new HashMap<>();
private static final HashMap<String, ArrayList<String>> HOSTS_REGEX = new HashMap<>();
private static final HashMap<String, ArrayList<String>> HOSTS_SCRIPT = new HashMap<>();
public static void clearRule() {
HOSTS_RULE.clear();
HOSTS_FILTER.clear();
HOSTS_REGEX.clear();
HOSTS_SCRIPT.clear();
}
public static void addHostRule(String host, ArrayList<String> rule) {
@ -159,6 +163,25 @@ public class VideoParseRuler {
return isFilter;
}
public static void addHostScript(String host, ArrayList<String> script) {
if (script == null || script.size() == 0) return;
ArrayList<String> temp = new ArrayList<>();
if (HOSTS_SCRIPT.get(host) != null && HOSTS_SCRIPT.get(host).size() > 0) temp = HOSTS_SCRIPT.get(host);
assert temp != null;
temp.addAll(script);
HOSTS_SCRIPT.put(host, temp);
}
public static String getHostScript(String url) {
for (Map.Entry<String, ArrayList<String>> entry : HOSTS_SCRIPT.entrySet()) {
String host = entry.getKey();
if (url.contains(host)) {
List<String> list = entry.getValue();
if (list != null && !list.isEmpty()) {
return list.get(0);
}
}
}
return "";
}
}

Loading…
Cancel
Save