From c44520a3f748053050f7e8cc9d5af23bd4e6c34f Mon Sep 17 00:00:00 2001 From: FongMi Date: Sun, 30 Jul 2023 02:55:40 +0800 Subject: [PATCH] [leanback] support search pg --- .../tv/ui/activity/CollectActivity.java | 3 +- .../tv/ui/fragment/CollectFragment.java | 59 ++++++++++++++++--- .../android/tv/model/SiteViewModel.java | 23 ++++++++ .../com/undcover/freedom/pyramid/Spider.java | 5 ++ .../com/fongmi/quickjs/crawler/Spider.java | 5 ++ 5 files changed, 86 insertions(+), 9 deletions(-) diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CollectActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CollectActivity.java index 4cce35a78..1ee07c040 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CollectActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CollectActivity.java @@ -189,7 +189,8 @@ public class CollectActivity extends BaseActivity { @NonNull @Override public Fragment getItem(int position) { - return CollectFragment.newInstance(((Collect) mAdapter.get(position)).getList()); + Collect collect = (Collect) mAdapter.get(position); + return CollectFragment.newInstance(getKeyword(), collect.getSite(), collect.getList()); } @Override diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/CollectFragment.java b/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/CollectFragment.java index 6e85fd695..5b203e9d6 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/CollectFragment.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/CollectFragment.java @@ -9,18 +9,21 @@ import androidx.annotation.Nullable; import androidx.leanback.widget.ArrayObjectAdapter; import androidx.leanback.widget.ItemBridgeAdapter; import androidx.leanback.widget.ListRow; +import androidx.lifecycle.ViewModelProvider; import androidx.viewbinding.ViewBinding; -import com.fongmi.android.tv.App; import com.fongmi.android.tv.Product; import com.fongmi.android.tv.R; import com.fongmi.android.tv.bean.Result; +import com.fongmi.android.tv.bean.Site; import com.fongmi.android.tv.bean.Vod; import com.fongmi.android.tv.databinding.FragmentVodBinding; +import com.fongmi.android.tv.model.SiteViewModel; import com.fongmi.android.tv.ui.activity.DetailActivity; import com.fongmi.android.tv.ui.activity.VodActivity; import com.fongmi.android.tv.ui.base.BaseFragment; import com.fongmi.android.tv.ui.custom.CustomRowPresenter; +import com.fongmi.android.tv.ui.custom.CustomScroller; import com.fongmi.android.tv.ui.custom.CustomSelector; import com.fongmi.android.tv.ui.presenter.VodPresenter; import com.fongmi.android.tv.utils.ResUtil; @@ -29,22 +32,40 @@ import com.google.common.collect.Lists; import java.util.ArrayList; import java.util.List; -public class CollectFragment extends BaseFragment implements VodPresenter.OnClickListener { +public class CollectFragment extends BaseFragment implements CustomScroller.Callback, VodPresenter.OnClickListener { private FragmentVodBinding mBinding; private ArrayObjectAdapter mAdapter; private ArrayObjectAdapter mLast; - private String json; + private CustomScroller mScroller; + private SiteViewModel mViewModel; + private List mItems; + private String mKeyword; + private Site mSite; + + public static CollectFragment newInstance(String keyword, Site site, List items) { + return new CollectFragment().setKeyword(keyword).setSite(site).setItems(items); + } - public static CollectFragment newInstance(List items) { - return new CollectFragment().setJson(App.gson().toJson(items)); + private CollectFragment setKeyword(String keyword) { + this.mKeyword = keyword; + return this; } - private CollectFragment setJson(String json) { - this.json = json; + private CollectFragment setSite(Site site) { + this.mSite = site; return this; } + private CollectFragment setItems(List items) { + this.mItems = items; + return this; + } + + private boolean isAll() { + return mSite.getKey().equals("all"); + } + @Override protected ViewBinding getBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { return mBinding = FragmentVodBinding.inflate(inflater, container, false); @@ -52,16 +73,32 @@ public class CollectFragment extends BaseFragment implements VodPresenter.OnClic @Override protected void initView() { + mScroller = new CustomScroller(this); + setRecyclerView(); + setViewModel(); + } + + private void setRecyclerView() { CustomSelector selector = new CustomSelector(); + if (!isAll()) mBinding.recycler.addOnScrollListener(mScroller); selector.addPresenter(ListRow.class, new CustomRowPresenter(16), VodPresenter.class); mBinding.recycler.setAdapter(new ItemBridgeAdapter(mAdapter = new ArrayObjectAdapter(selector))); mBinding.recycler.setHeader(getActivity().findViewById(R.id.result), getActivity().findViewById(R.id.recycler)); mBinding.recycler.setVerticalSpacing(ResUtil.dp2px(16)); } + private void setViewModel() { + mViewModel = new ViewModelProvider(this).get(SiteViewModel.class); + mViewModel.search.observe(this, result -> { + int size = result.getList().size(); + mScroller.endLoading(size == 0); + addVideo(result.getList()); + }); + } + @Override protected void initData() { - addVideo(Vod.arrayFrom(json)); + addVideo(mItems); } private boolean checkLastSize(List items) { @@ -97,6 +134,12 @@ public class CollectFragment extends BaseFragment implements VodPresenter.OnClic return false; } + @Override + public void onLoadMore(String page) { + mViewModel.searchContent(mSite, mKeyword, page); + mScroller.setLoading(true); + } + @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); diff --git a/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java b/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java index 0d1782ec2..435ce2654 100644 --- a/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java +++ b/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java @@ -201,6 +201,29 @@ public class SiteViewModel extends ViewModel { } } + public void searchContent(Site site, String keyword, String page) { + execute(search, () -> { + if (site.getType() == 3) { + Spider spider = ApiConfig.get().getCSP(site); + String searchContent = spider.searchContent(Trans.t2s(keyword), false, page); + SpiderDebug.log(site.getName() + "," + searchContent); + Result result = Result.fromJson(searchContent); + for (Vod vod : result.getList()) vod.setSite(site); + return result; + } else { + ArrayMap params = new ArrayMap<>(); + params.put("wd", Trans.t2s(keyword)); + params.put("pg", page); + if (site.getType() != 0) params.put("ac", "detail"); + String body = OkHttp.newCall(site.getApi(), params).execute().body().string(); + SpiderDebug.log(site.getName() + "," + body); + Result result = site.getType() == 0 ? Result.fromXml(body) : Result.fromJson(body); + for (Vod vod : result.getList()) vod.setSite(site); + return fetchPic(site, result); + } + }); + } + private Result fetchPic(Site site, Result result) throws Exception { if (result.getList().isEmpty() || result.getList().get(0).getVodPic().length() > 0) return result; ArrayList ids = new ArrayList<>(); diff --git a/pyramid/src/main/java/com/undcover/freedom/pyramid/Spider.java b/pyramid/src/main/java/com/undcover/freedom/pyramid/Spider.java index 8633cee6f..568bfb84c 100644 --- a/pyramid/src/main/java/com/undcover/freedom/pyramid/Spider.java +++ b/pyramid/src/main/java/com/undcover/freedom/pyramid/Spider.java @@ -66,6 +66,11 @@ public class Spider extends com.github.catvod.crawler.Spider { return app.callAttr("searchContent", obj, key, quick).toString(); } + @Override + public String searchContent(String key, boolean quick, String pg) { + return app.callAttr("searchContent", obj, key, quick, pg).toString(); + } + @Override public String playerContent(String flag, String id, List vipFlags) { return app.callAttr("playerContent", obj, flag, id, gson.toJson(vipFlags)).toString(); diff --git a/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java b/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java index 630eaa09b..720d7fcf9 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/crawler/Spider.java @@ -92,6 +92,11 @@ public class Spider extends com.github.catvod.crawler.Spider { return (String) call("search", key, quick)[0]; } + @Override + public String searchContent(String key, boolean quick, String pg) throws Exception { + return (String) call("search", key, quick, pg)[0]; + } + @Override public String playerContent(String flag, String id, List vipFlags) throws Exception { JSArray array = submit(() -> JSUtil.toArray(ctx, vipFlags)).get();