From 4bab3fcddbb08c004e00d7bcc4abf4398ef0d178 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8E=E4=BF=8A?= <215613905@qq.com> Date: Fri, 21 Oct 2022 16:17:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=A6=96=E9=A1=B5=E6=8E=A8?= =?UTF-8?q?=E8=8D=90=E5=A4=9A=E8=A1=8C=E6=98=BE=E7=A4=BA=E5=BC=80=E5=85=B3?= =?UTF-8?q?;=20=E6=9B=B4=E5=AE=8C=E5=96=84=E7=9A=84=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E9=81=93=E9=95=BFdrpy;=20=E6=90=9C=E7=B4=A2=E8=BD=AF=E9=94=AE?= =?UTF-8?q?=E7=9B=98bug=E4=BF=AE=E6=AD=A3;=20=E6=92=AD=E6=94=BE=E5=9C=B0?= =?UTF-8?q?=E5=9D=80=E9=9A=8F=E6=92=AD=E6=94=BE=E5=88=87=E6=8D=A2;=20?= =?UTF-8?q?=E5=85=A8=E5=B1=80=E6=97=8B=E8=BD=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 21 +- .../tvbox/osc/ui/activity/DetailActivity.java | 3 + .../tvbox/osc/ui/activity/SearchActivity.java | 33 +- .../osc/ui/fragment/ModelSettingFragment.java | 11 + .../tvbox/osc/ui/fragment/UserFragment.java | 39 ++- .../com/github/tvbox/osc/util/HawkConfig.java | 1 + .../github/tvbox/osc/util/js/HtmlParser.java | 315 ++++++++++++++++++ .../github/tvbox/osc/util/js/JSEngine.java | 35 +- app/src/main/res/layout/activity_search.xml | 1 + app/src/main/res/layout/dialog_api.xml | 1 + app/src/main/res/layout/fragment_model.xml | 62 +++- app/src/main/res/layout/fragment_user.xml | 26 +- .../com/github/tvbox/quickjs/JSUtils.java | 167 ++++++++++ 13 files changed, 659 insertions(+), 56 deletions(-) create mode 100644 app/src/main/java/com/github/tvbox/osc/util/js/HtmlParser.java create mode 100644 quickjs/src/main/java/com/github/tvbox/quickjs/JSUtils.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9821750f..a5062866 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,13 @@ + + + @@ -27,7 +34,7 @@ + android:screenOrientation="sensorLandscape"> @@ -49,22 +56,22 @@ android:screenOrientation="sensorLandscape" /> + android:screenOrientation="sensorLandscape" /> + android:screenOrientation="sensorLandscape" /> + android:screenOrientation="sensorLandscape" /> + android:screenOrientation="sensorLandscape" /> + android:screenOrientation="sensorLandscape" /> + android:screenOrientation="sensorLandscape" /> 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 8414e08f..a2005005 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 @@ -42,6 +42,7 @@ import com.github.tvbox.osc.ui.fragment.PlayFragment; import com.github.tvbox.osc.util.DefaultConfig; import com.github.tvbox.osc.util.FastClickCheckUtil; import com.github.tvbox.osc.util.HawkConfig; +import com.github.tvbox.osc.util.LOG; import com.github.tvbox.osc.util.MD5; import com.github.tvbox.osc.util.SearchHelper; import com.github.tvbox.osc.viewmodel.SourceViewModel; @@ -375,6 +376,8 @@ public class DetailActivity extends BaseActivity { private void jumpToPlay() { if (vodInfo != null && vodInfo.seriesMap.get(vodInfo.playFlag).size() > 0) { preFlag = vodInfo.playFlag; + //更新播放地址 + setTextShow(tvPlayUrl, "播放地址:", vodInfo.seriesMap.get(vodInfo.playFlag).get(vodInfo.playIndex).url); Bundle bundle = new Bundle(); //保存历史 insertVod(sourceKey, vodInfo); diff --git a/app/src/main/java/com/github/tvbox/osc/ui/activity/SearchActivity.java b/app/src/main/java/com/github/tvbox/osc/ui/activity/SearchActivity.java index 6898bd21..413ddb59 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/activity/SearchActivity.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/activity/SearchActivity.java @@ -36,6 +36,7 @@ import com.github.tvbox.osc.ui.tv.QRCodeGen; 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.LOG; import com.github.tvbox.osc.util.SearchHelper; import com.github.tvbox.osc.util.js.JSEngine; import com.github.tvbox.osc.viewmodel.SourceViewModel; @@ -95,7 +96,6 @@ public class SearchActivity extends BaseActivity { private static Boolean hasKeyBoard; @Override protected void init() { - disableKeyboard(SearchActivity.this); initView(); initViewModel(); initData(); @@ -212,15 +212,14 @@ public class SearchActivity extends BaseActivity { etSearch.setText(""); } }); - etSearch.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { -// Toast.makeText(mContext,"点击",Toast.LENGTH_SHORT).show(); - if(!hasKeyBoard)enableKeyboard(SearchActivity.this); - openSystemKeyBoard();//再次尝试拉起键盘 - SearchActivity.this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); - } - }); +// etSearch.setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View v) { +// enableKeyboard(SearchActivity.this); +// openSystemKeyBoard();//再次尝试拉起键盘 +// SearchActivity.this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); +// } +// }); // etSearch.setOnFocusChangeListener(tvSearchFocusChangeListener); keyboard.setOnSearchKeyListener(new SearchKeyboard.OnSearchKeyListener() { @@ -505,18 +504,4 @@ public class SearchActivity extends BaseActivity { } EventBus.getDefault().unregister(this); } - -// @Override -// public boolean dispatchKeyEvent(KeyEvent event) { -// if (event.getAction() == KeyEvent.ACTION_DOWN) { -// int keyCode = event.getKeyCode(); -// if (keyCode == KeyEvent.KEYCODE_MENU) { -// if(!hasKeyBoard)enableKeyboard(SearchActivity.this); -// openSystemKeyBoard();//再次尝试拉起键盘 -// getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); -// } -// } else if (event.getAction() == KeyEvent.ACTION_UP) { -// } -// return super.dispatchKeyEvent(event); -// } } \ No newline at end of file diff --git a/app/src/main/java/com/github/tvbox/osc/ui/fragment/ModelSettingFragment.java b/app/src/main/java/com/github/tvbox/osc/ui/fragment/ModelSettingFragment.java index 1d13c15d..f4eea3df 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/fragment/ModelSettingFragment.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/fragment/ModelSettingFragment.java @@ -67,6 +67,7 @@ public class ModelSettingFragment extends BaseLazyFragment { private TextView tvSearchView; private TextView tvShowPreviewText; private TextView tvFastSearchText; + private TextView tvRecStyleText; public static ModelSettingFragment newInstance() { return new ModelSettingFragment().setArguments(); @@ -85,6 +86,8 @@ public class ModelSettingFragment extends BaseLazyFragment { protected void init() { tvFastSearchText = findViewById(R.id.showFastSearchText); tvFastSearchText.setText(Hawk.get(HawkConfig.FAST_SEARCH_MODE, false) ? "已开启" : "已关闭"); + tvRecStyleText = findViewById(R.id.showRecStyleText); + tvRecStyleText.setText(Hawk.get(HawkConfig.HOME_REC_STYLE, false) ? "是" : "否"); tvShowPreviewText = findViewById(R.id.showPreviewText); tvShowPreviewText.setText(Hawk.get(HawkConfig.SHOW_PREVIEW, true) ? "开启" : "关闭"); tvDebugOpen = findViewById(R.id.tvDebugOpen); @@ -608,6 +611,14 @@ public class ModelSettingFragment extends BaseLazyFragment { tvFastSearchText.setText(Hawk.get(HawkConfig.FAST_SEARCH_MODE, false) ? "已开启" : "已关闭"); } }); + findViewById(R.id.llHomeRecStyle).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + FastClickCheckUtil.check(v); + Hawk.put(HawkConfig.HOME_REC_STYLE, !Hawk.get(HawkConfig.HOME_REC_STYLE, false)); + tvRecStyleText.setText(Hawk.get(HawkConfig.HOME_REC_STYLE, false) ? "是" : "否"); + } + }); } @Override 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 944cb6eb..3d684a8d 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 @@ -36,6 +36,7 @@ import com.lzy.okgo.model.Response; import com.orhanobut.hawk.Hawk; import com.owen.tvrecyclerview.widget.TvRecyclerView; import com.owen.tvrecyclerview.widget.V7GridLayoutManager; +import com.owen.tvrecyclerview.widget.V7LinearLayoutManager; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; @@ -59,6 +60,8 @@ public class UserFragment extends BaseLazyFragment implements View.OnClickListen private LinearLayout tvPush; private HomeHotVodAdapter homeHotVodAdapter; private List homeSourceRec; + TvRecyclerView tvHotList1; + TvRecyclerView tvHotList2; public static UserFragment newInstance() { return new UserFragment(); @@ -75,6 +78,15 @@ 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, 0) == 2) { List allVodRecord = RoomDataManger.getAllVodRecord(10); @@ -119,9 +131,9 @@ public class UserFragment extends BaseLazyFragment implements View.OnClickListen tvHistory.setOnFocusChangeListener(focusChangeListener); tvPush.setOnFocusChangeListener(focusChangeListener); tvCollect.setOnFocusChangeListener(focusChangeListener); - TvRecyclerView tvHotList = findViewById(R.id.tvHotList); - tvHotList.setHasFixedSize(true); - tvHotList.setLayoutManager(new V7GridLayoutManager(this.mContext, 6)); homeHotVodAdapter = new HomeHotVodAdapter(); + tvHotList1 = findViewById(R.id.tvHotList1); + tvHotList2 = findViewById(R.id.tvHotList2); + homeHotVodAdapter = new HomeHotVodAdapter(); homeHotVodAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() { @Override public void onItemClick(BaseQuickAdapter adapter, View view, int position) { @@ -164,7 +176,24 @@ public class UserFragment extends BaseLazyFragment implements View.OnClickListen } }); - tvHotList.setOnItemListener(new TvRecyclerView.OnItemListener() { + 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() { @Override public void onItemPreSelected(TvRecyclerView parent, View itemView, int position) { itemView.animate().scaleX(1.0f).scaleY(1.0f).setDuration(300).setInterpolator(new BounceInterpolator()).start(); @@ -180,7 +209,7 @@ public class UserFragment extends BaseLazyFragment implements View.OnClickListen } }); - tvHotList.setAdapter(homeHotVodAdapter); + tvHotList2.setAdapter(homeHotVodAdapter); initHomeHotVod(homeHotVodAdapter); } diff --git a/app/src/main/java/com/github/tvbox/osc/util/HawkConfig.java b/app/src/main/java/com/github/tvbox/osc/util/HawkConfig.java index 97fcbb38..752ed2c8 100644 --- a/app/src/main/java/com/github/tvbox/osc/util/HawkConfig.java +++ b/app/src/main/java/com/github/tvbox/osc/util/HawkConfig.java @@ -34,4 +34,5 @@ public class HawkConfig { public static final String SUBTITLE_TEXT_SIZE = "subtitle_text_size"; public static final String SUBTITLE_TIME_DELAY = "subtitle_time_delay"; public static final String SOURCES_FOR_SEARCH = "sources_for_search"; + public static final String HOME_REC_STYLE = "home_rec_style"; } \ No newline at end of file diff --git a/app/src/main/java/com/github/tvbox/osc/util/js/HtmlParser.java b/app/src/main/java/com/github/tvbox/osc/util/js/HtmlParser.java new file mode 100644 index 00000000..0ca128c7 --- /dev/null +++ b/app/src/main/java/com/github/tvbox/osc/util/js/HtmlParser.java @@ -0,0 +1,315 @@ +package com.github.tvbox.osc.util.js; + +import android.text.TextUtils; + +import com.github.tvbox.quickjs.JSUtils; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; + +public class HtmlParser { + private static final String[] normalAttrs = {"href", "src", "class", "title", "alt"}; + private static String baseUrl; + + public static Element getTrueElement(String rule, Element element) { + if (rule.startsWith("Text") || rule.startsWith("Attr")) { + return element; + } + for (String normalAttr : normalAttrs) { + if (normalAttr.equals(rule)) { + return element; + } + } + //剔除元素 + String[] rules = rule.split("--"); + if (rules.length > 1) { + Element e = getTrueElement(rules[0], element); + String s = e.outerHtml(); + for (int i = 1; i < rules.length; i++) { + String r = getTrueElement(rules[i], e).outerHtml(); + s = s.replace(r, ""); + e = Jsoup.parse(s); + } + return e; + } + //或规则 + String[] ors = rule.split("\\|\\|"); + if (ors.length > 1) { + for (String or : ors) { + Element e = null; + try { + e = getTrueElement(or, element); + } catch (Exception e1) { + e1.printStackTrace(); + } + if (e != null) { + return e; + } + } + } + String[] ss01 = rule.split(","); + if (ss01.length > 1) { + int index = Integer.parseInt(ss01[1]); + Elements elements = element.select(ss01[0]); + if (index < 0) { + return elements.get(elements.size() + index); + } else { + return element.select(ss01[0]).get(index); + } + } else return element.selectFirst(rule); + } + + private static Elements selectElementsWithoutOr(Element element, String rule) { + String[] rules = rule.split(","); + if (rules.length > 1) { + String[] indexNumbs = rules[1].split(":", -1); + int startPos = 0; + int endPos = 0; + if (!TextUtils.isEmpty(indexNumbs[0])) { + try { + startPos = Integer.parseInt(indexNumbs[0]); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + } + if (!TextUtils.isEmpty(indexNumbs[1])) { + try { + endPos = Integer.parseInt(indexNumbs[1]); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + } + Elements elements = element.select(rules[0]); + if (endPos > elements.size()) { + endPos = elements.size(); + } + if (endPos <= 0) { + endPos = elements.size() + endPos; + } + Elements res = new Elements(); + for (int i = startPos; i < endPos; i++) { + res.add(elements.get(i)); + } + return res; + } else { + return element.select(rule); + } + } + + public static String getText(Element element, String lastRule) { + if ("*".equals(lastRule)) { + return "null"; + } + String[] ors = lastRule.split("\\|\\|"); + if (ors.length > 1) { + for (String or : ors) { + String e = null; + try { + e = getTextWithoutOr(element, or); + } catch (Exception e1) { + e1.printStackTrace(); + } + if (!TextUtils.isEmpty(e)) { + return e; + } + } + } + return getTextWithoutOr(element, lastRule); + } + + private static String getTextWithoutOr(Element element, String lastRule) { + String js = ""; + String[] ss = lastRule.split("\\.js:"); + if (ss.length > 1) { + lastRule = ss[0]; + js = JSUtils.arrayToString(ss, 1, ss.length, ".js:"); + } + String[] rules = lastRule.split("!"); + String text; + if (rules.length > 1) { + if ("Text".equals(rules[0])) { + text = element.text(); + } else if ("Html".equals(rules[0])) { + text = element.html(); + } else if (rules[0].contains("Attr")) { + text = element.attr(rules[0].replace("Attr", "")); + } else { + text = element.attr(rules[0]); + } + if (!"Html".equals(lastRule)) { + text = text.replaceAll("\n", " "); + } + for (int i = 1; i < rules.length; i++) { + text = text.replace(rules[i], ""); + } + } else { + if ("Text".equals(lastRule)) { + text = element.text(); + } else if ("Html".equals(lastRule)) { + text = element.html(); + } else if (lastRule.contains("Attr")) { + text = element.attr(lastRule.replace("Attr", "")); + } else { + text = element.attr(lastRule); + } + if (!"Html".equals(lastRule)) { + text = text.replaceAll("\n", " "); + } + } + + return text; + } + + public static String getUrl(Element element3, String lastRule, String lastUrl) { + if ("*".equals(lastRule)) { + return "null"; + } + String[] ors = lastRule.split("\\|\\|"); + if (ors.length > 1) { + for (String or : ors) { + String e = null; + try { + e = getUrlWithoutOr(element3, or, lastUrl); + } catch (Exception e1) { + e1.printStackTrace(); + } + if (!TextUtils.isEmpty(e)) { + return e; + } + } + } + // Log.d(TAG, "getUrl getUrlWithoutOr: " + url); + return getUrlWithoutOr(element3, lastRule, lastUrl); + } + + private static String getUrlWithoutOr(Element element3, String lastRule, String lastUrl) { + String js = ""; + String[] ss = lastRule.split("\\.js:"); + if (ss.length > 1) { + lastRule = ss[0]; + js = JSUtils.arrayToString(ss, 1, ss.length, ".js:"); +// Log.d(TAG, "getUrlWithoutOr: " + js); + } + if(element3 == null){ + return ""; + } + String url; +// String[] rules = lastRule.split("@js:"); + if (lastRule.startsWith("Text")) { + url = element3.text(); + } else if ("Html".equals(lastRule)) { + url = element3.html(); + } else if (lastRule.startsWith("AttrNo")) { + url = element3.attr(lastRule.replaceFirst("AttrNo", "")); + return baseUrl + url; + } else if (lastRule.startsWith("AttrYes")) { + url = element3.attr(lastRule.replaceFirst("AttrYes", "")); + } else if (lastRule.startsWith("Attr")) { + url = element3.attr(lastRule.replaceFirst("Attr", "")); + } else { + url = element3.attr(lastRule); +// url = element3.select(lastRule).first().toString(); + } + if (TextUtils.isEmpty(js)) { + if (!"Html".equals(lastRule)) { + url = JSUtils.trimBlanks(url); + } + } + if (JSUtils.isEmpty(url)) { + return ""; + } + if ("Html".equals(lastRule)) { + return url; + } + if (url.startsWith("http")) { + return url; + } else if (url.startsWith("//")) { + return "http:" + url; + } else if (url.startsWith("magnet") || url.startsWith("thunder") || url.startsWith("ftp") || url.startsWith("ed2k")) { + return url; + } else if (url.startsWith("/") || url.startsWith("./") || url.startsWith("../") || url.startsWith("?")) { + return joinUrl(lastUrl, url); + } else { + String[] urls = url.split("\\$"); + if (urls.length > 1 && urls[1].startsWith("http")) { + return urls[1]; + } + if (url.contains("url(")) { + String[] urls2 = url.split("url\\("); + if (urls2.length > 1 && urls2[1].startsWith("http")) { + return urls2[1].split("\\)")[0]; + } + } + return joinUrl(lastUrl, url); + } + } + + public static String joinUrl(String parent, String child) { + if (JSUtils.isEmpty(parent)) { + return child; + } + URL url; + String q = parent; + try { + url = new URL(new URL(parent), child); + q = url.toExternalForm(); + } catch (MalformedURLException e) { + e.printStackTrace(); + } +// if (q.contains("#")) { +// q = q.replaceAll("^(.+?)#.*?$", "$1"); +// } + return q; + } + + public static String parseDomForUrl(String html, String rule, String movieUrl) { + Document doc = Jsoup.parse(html); + String[] ss4 = rule.split("&&"); + Element element3; + if (ss4.length == 1) { + element3 = doc; + } else { + element3 = getTrueElement(ss4[0], doc); + } + for (int i = 1; i < ss4.length - 1; i++) { + element3 = getTrueElement(ss4[i], element3); + } + baseUrl = JSUtils.getBaseUrl(movieUrl); + return getUrl(element3, ss4[ss4.length - 1], movieUrl); + } + + public static List parseDomForList(String html, String rule) { + Document doc = Jsoup.parse(html); + String[] ss2 = rule.split("&&"); + //循环获取 + Elements elements = new Elements(); + Element element; + element = getTrueElement(ss2[0], doc); + for (int i = 1; i < ss2.length - 1; i++) { + element = getTrueElement(ss2[i], element); + } + rule = ss2[ss2.length - 1]; + String[] ors = rule.split("\\|\\|"); + Elements res = new Elements(); + for (String or : ors) { + try { + res.addAll(selectElementsWithoutOr(element, or)); + } catch (Exception e1) { + e1.printStackTrace(); + } + } + elements.addAll(res); + List eleHtml = new ArrayList<>(); + for (Element element1 : elements) { + eleHtml.add(element1.outerHtml()); + } + return eleHtml; + } +} diff --git a/app/src/main/java/com/github/tvbox/osc/util/js/JSEngine.java b/app/src/main/java/com/github/tvbox/osc/util/js/JSEngine.java index a89a7378..c8c60754 100644 --- a/app/src/main/java/com/github/tvbox/osc/util/js/JSEngine.java +++ b/app/src/main/java/com/github/tvbox/osc/util/js/JSEngine.java @@ -14,6 +14,7 @@ import com.github.tvbox.quickjs.JSCallFunction; import com.github.tvbox.quickjs.JSModule; import com.github.tvbox.quickjs.JSObject; import com.github.tvbox.quickjs.QuickJSContext; +import com.google.gson.Gson; import com.lzy.okgo.OkGo; import org.json.JSONObject; @@ -296,37 +297,43 @@ public class JSEngine { }); jsContext.getGlobalObject().setProperty("pdfh", new JSCallFunction() { @Override - public Element call(Object... args) { + public String call(Object... args) { try { - // TODO +// LOG.i("pdfh----------------:"+args[1].toString().trim()); String html=args[0].toString(); - Document doc=Jsoup.parse(html); - return doc.selectFirst(args[1].toString().trim()); + return HtmlParser.parseDomForUrl(html, args[1].toString().trim(), ""); } catch (Throwable throwable) { throwable.printStackTrace(); } - return null; + return ""; } }); jsContext.getGlobalObject().setProperty("pdfa", new JSCallFunction() { @Override - public ArrayList call(Object... args) { + public Object call(Object... args) { try { - // TODO +// LOG.i("pdfa----------------:"+args[1].toString().trim()); String html=args[0].toString(); - Document doc=Jsoup.parse(html); - Elements list=doc.select(args[1].toString().trim()); - ArrayList arraylist=new ArrayList<>(); - for (int i = 0; i < list.size(); i++) { - arraylist.add(list.get(i).html()); - } - return arraylist; + return jsContext.parseJSON(new Gson().toJson(HtmlParser.parseDomForList(html, args[1].toString().trim()))); } catch (Throwable throwable) { throwable.printStackTrace(); } return null; } }); + jsContext.getGlobalObject().setProperty("pd", new JSCallFunction() { + @Override + public String call(Object... args) { + try { +// LOG.i("pd----------------:"+args[2].toString().trim()); + String html=args[0].toString(); + return HtmlParser.parseDomForUrl(html, args[1].toString().trim(), args[2].toString()); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + return ""; + } + }); } } diff --git a/app/src/main/res/layout/activity_search.xml b/app/src/main/res/layout/activity_search.xml index 8dfb873c..1c0bec8e 100644 --- a/app/src/main/res/layout/activity_search.xml +++ b/app/src/main/res/layout/activity_search.xml @@ -38,6 +38,7 @@ android:background="@drawable/input_search" android:hint="请输入要搜索的内容" android:inputType="text" + android:imeOptions="actionDone" android:maxLines="1" android:paddingLeft="@dimen/vs_10" android:paddingRight="@dimen/vs_10" diff --git a/app/src/main/res/layout/dialog_api.xml b/app/src/main/res/layout/dialog_api.xml index 3ece246e..327cc6d6 100644 --- a/app/src/main/res/layout/dialog_api.xml +++ b/app/src/main/res/layout/dialog_api.xml @@ -94,6 +94,7 @@ android:layout_height="wrap_content" android:layout_weight="1" android:background="@drawable/input_dialog_api_input" + android:imeOptions="actionDone" android:hint="请输入配置地址" android:inputType="text" android:maxLines="1" diff --git a/app/src/main/res/layout/fragment_model.xml b/app/src/main/res/layout/fragment_model.xml index d0e33814..33e5feb0 100644 --- a/app/src/main/res/layout/fragment_model.xml +++ b/app/src/main/res/layout/fragment_model.xml @@ -202,6 +202,15 @@ android:orientation="horizontal"> + + - - - - + + + + + + + + + + + + + + app:tv_verticalSpacingWithMargins="@dimen/vs_10" + android:visibility="gone" /> + + diff --git a/quickjs/src/main/java/com/github/tvbox/quickjs/JSUtils.java b/quickjs/src/main/java/com/github/tvbox/quickjs/JSUtils.java new file mode 100644 index 00000000..03b669c1 --- /dev/null +++ b/quickjs/src/main/java/com/github/tvbox/quickjs/JSUtils.java @@ -0,0 +1,167 @@ +package com.github.tvbox.quickjs; + + +import java.lang.reflect.Array; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +public class JSUtils { + + public static boolean isEmpty( CharSequence str) { + return str == null || str.length() == 0; + } + + public static boolean isNotEmpty( CharSequence str) { + return !isEmpty(str); + } + + public static boolean isNull(Object obj) { + return obj == null; + } + + public static boolean isNotNull(Object obj) { + return !isNull(obj); + } + + public static boolean isEmpty(Object obj) { + if (obj == null) return true; + else if (obj instanceof CharSequence) return ((CharSequence) obj).length() == 0; + else if (obj instanceof Collection) return ((Collection) obj).isEmpty(); + else if (obj instanceof Map) return ((Map) obj).isEmpty(); + else if (obj.getClass().isArray()) return Array.getLength(obj) == 0; + + return false; + } + + public static boolean isNotEmpty(Object obj) { + return !isEmpty(obj); + } + + private static final String U2028 = new String(new byte[]{ (byte)0xE2, (byte)0x80, (byte)0xA8 }); + private static final String U2029 = new String(new byte[]{ (byte)0xE2, (byte)0x80, (byte)0xA9 }); + + /** + * Escape JavaString string + * @param line unescaped string + * @return escaped string + */ + public static String escapeJavaScriptString(final String line) + { + final StringBuilder sb = new StringBuilder(); + for (int i = 0; i < line.length(); i++) + { + char c = line.charAt(i); + switch (c) + { + case '"': + case '\'': + case '\\': + sb.append('\\'); + sb.append(c); + break; + + case '\n': + sb.append("\\n"); + break; + + case '\r': + sb.append("\\r"); + break; + + default: + sb.append(c); + } + } + + return sb.toString() + .replace(U2028, "\u2028") + .replace(U2029, "\u2029"); + } + + public static String getBaseUrl(String url) { + if (isEmpty(url)) { + return url; + } + String baseUrls = url.replace("http://", "").replace("https://", ""); + String baseUrl2 = baseUrls.split("/")[0]; + String baseUrl; + if (url.startsWith("https")) { + baseUrl = "https://" + baseUrl2; + } else { + baseUrl = "http://" + baseUrl2; + } + return baseUrl; + } + + + public static String arrayToString(String[] list, int fromIndex, String cha) { + return arrayToString(list, fromIndex, list == null ? 0 : list.length, cha); + } + + public static String arrayToString(String[] list, int fromIndex, int endIndex, String cha) { + StringBuilder builder = new StringBuilder(); + if (list == null || list.length <= fromIndex) { + return ""; + } else if (list.length <= 1) { + return list[0]; + } else { + builder.append(list[fromIndex]); + } + for (int i = 1 + fromIndex; i < list.length && i < endIndex; i++) { + builder.append(cha).append(list[i]); + } + return builder.toString(); + } + + public static String listToString(List list, String cha) { + StringBuilder builder = new StringBuilder(); + if (list == null || list.size() <= 0) { + return ""; + } else if (list.size() <= 1) { + return list.get(0); + } else { + builder.append(list.get(0)); + } + for (int i = 1; i < list.size(); i++) { + builder.append(cha).append(list.get(i)); + } + return builder.toString(); + } + + public static String listToString(List list, int fromIndex, String cha) { + StringBuilder builder = new StringBuilder(); + if (list == null || list.size() <= fromIndex) { + return ""; + } else if (list.size() <= 1) { + return list.get(0); + } else { + builder.append(list.get(fromIndex)); + } + for (int i = fromIndex + 1; i < list.size(); i++) { + builder.append(cha).append(list.get(i)); + } + return builder.toString(); + } + + public static String listToString(List list) { + return listToString(list, "&&"); + } + + public static String trimBlanks(String str) { + if (str == null || str.length() == 0) { + return str; + } + int len = str.length(); + int st = 0; + + while ((st < len) && (str.charAt(st) == '\n' || str.charAt(st) == '\r' || str.charAt(st) == '\f' || str.charAt(st) == '\t')) { + st++; + } + while ((st < len) && (str.charAt(len - 1) == '\n' || str.charAt(len - 1) == '\r' || str.charAt(len - 1) == '\f' || str.charAt(len - 1) == '\t')) { + len--; + } + return ((st > 0) || (len < str.length())) ? str.substring(st, len) : str; + } + +}