From c4b8908ba2796d4e707bcd92fa2208111c9afef3 Mon Sep 17 00:00:00 2001 From: SDL <> Date: Fri, 1 Jul 2022 16:54:44 +0800 Subject: [PATCH] Temp commit. --- .../com/github/tvbox/osc/api/ApiConfig.java | 1 + .../java/com/github/tvbox/osc/base/App.java | 1 + .../com/github/tvbox/osc/bean/AbsJson.java | 2 +- .../github/tvbox/osc/bean/AbsSortJson.java | 20 ++- .../com/github/tvbox/osc/bean/AbsSortXml.java | 8 +- .../com/github/tvbox/osc/bean/SourceBean.java | 21 +-- .../osc/ui/activity/CollectActivity.java | 17 +- .../tvbox/osc/ui/activity/HomeActivity.java | 31 +++- .../osc/ui/activity/SettingActivity.java | 8 +- .../osc/ui/adapter/HomeHotVodAdapter.java | 24 +-- .../tvbox/osc/ui/fragment/UserFragment.java | 57 ++++-- .../github/tvbox/osc/util/DefaultConfig.java | 24 ++- .../com/github/tvbox/osc/util/HawkConfig.java | 1 + .../com/github/tvbox/osc/util/OkGoHelper.java | 9 + .../tvbox/osc/viewmodel/SourceViewModel.java | 162 ++++++++++++++++-- app/src/main/res/layout/fragment_model.xml | 94 ++++++++++ 16 files changed, 404 insertions(+), 76 deletions(-) diff --git a/app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java b/app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java index cecb4760..dd42ac38 100644 --- a/app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java +++ b/app/src/main/java/com/github/tvbox/osc/api/ApiConfig.java @@ -241,6 +241,7 @@ public class ApiConfig { sb.setFilterable(DefaultConfig.safeJsonInt(obj, "filterable", 1)); sb.setPlayerUrl(DefaultConfig.safeJsonString(obj, "playUrl", "")); sb.setExt(DefaultConfig.safeJsonString(obj, "ext", "")); + sb.setCategories(DefaultConfig.safeJsonStringList(obj, "categories")); if (firstSite == null) firstSite = sb; sourceBeanList.put(siteKey, sb); diff --git a/app/src/main/java/com/github/tvbox/osc/base/App.java b/app/src/main/java/com/github/tvbox/osc/base/App.java index 5fce938b..86c580d8 100644 --- a/app/src/main/java/com/github/tvbox/osc/base/App.java +++ b/app/src/main/java/com/github/tvbox/osc/base/App.java @@ -52,6 +52,7 @@ public class App extends MultiDexApplication { if (!Hawk.contains(HawkConfig.PLAY_TYPE)) { Hawk.put(HawkConfig.PLAY_TYPE, 1); } + Hawk.put(HawkConfig.HOME_REC, 2); } public static App getInstance() { diff --git a/app/src/main/java/com/github/tvbox/osc/bean/AbsJson.java b/app/src/main/java/com/github/tvbox/osc/bean/AbsJson.java index f00b4270..961face3 100644 --- a/app/src/main/java/com/github/tvbox/osc/bean/AbsJson.java +++ b/app/src/main/java/com/github/tvbox/osc/bean/AbsJson.java @@ -126,7 +126,7 @@ public class AbsJson implements Serializable { video.actor = vod_actor; video.director = vod_director; Movie.Video.UrlBean urlBean = new Movie.Video.UrlBean(); - if(vod_play_from != null) { + if (vod_play_from != null && vod_play_url != null) { String[] playFlags = vod_play_from.split("\\$\\$\\$"); String[] playUrls = vod_play_url.split("\\$\\$\\$"); List infoList = new ArrayList<>(); diff --git a/app/src/main/java/com/github/tvbox/osc/bean/AbsSortJson.java b/app/src/main/java/com/github/tvbox/osc/bean/AbsSortJson.java index 6393c6d4..c51e1d63 100644 --- a/app/src/main/java/com/github/tvbox/osc/bean/AbsSortJson.java +++ b/app/src/main/java/com/github/tvbox/osc/bean/AbsSortJson.java @@ -8,19 +8,33 @@ import java.util.ArrayList; public class AbsSortJson implements Serializable { @SerializedName(value = "class") - public ArrayList classList; + public ArrayList classes; + + @SerializedName(value = "list") + public ArrayList list; public AbsSortXml toAbsSortXml() { AbsSortXml absSortXml = new AbsSortXml(); MovieSort movieSort = new MovieSort(); movieSort.sortList = new ArrayList<>(); - for (AbsJsonClass cls : classList) { + for (AbsJsonClass cls : classes) { MovieSort.SortData sortData = new MovieSort.SortData(); sortData.id = cls.type_id; sortData.name = cls.type_name; movieSort.sortList.add(sortData); } - absSortXml.movieSort = movieSort; + if (list != null && !list.isEmpty()) { + Movie movie = new Movie(); + ArrayList videos = new ArrayList<>(); + for (AbsJson.AbsJsonVod vod : list) { + videos.add(vod.toXmlVideo()); + } + movie.videoList = videos; + absSortXml.list = movie; + } else { + absSortXml.list = null; + } + absSortXml.classes = movieSort; return absSortXml; } diff --git a/app/src/main/java/com/github/tvbox/osc/bean/AbsSortXml.java b/app/src/main/java/com/github/tvbox/osc/bean/AbsSortXml.java index 4fb3adb8..2a318a24 100644 --- a/app/src/main/java/com/github/tvbox/osc/bean/AbsSortXml.java +++ b/app/src/main/java/com/github/tvbox/osc/bean/AbsSortXml.java @@ -3,6 +3,7 @@ package com.github.tvbox.osc.bean; import com.thoughtworks.xstream.annotations.XStreamAlias; import java.io.Serializable; +import java.util.List; /** * @author pj567 @@ -12,5 +13,10 @@ import java.io.Serializable; @XStreamAlias("rss") public class AbsSortXml implements Serializable { @XStreamAlias("class") - public MovieSort movieSort; + public MovieSort classes; + + @XStreamAlias("list") + public Movie list; + + public List videoList; } \ No newline at end of file diff --git a/app/src/main/java/com/github/tvbox/osc/bean/SourceBean.java b/app/src/main/java/com/github/tvbox/osc/bean/SourceBean.java index 7b9d8941..8d9a8f5a 100644 --- a/app/src/main/java/com/github/tvbox/osc/bean/SourceBean.java +++ b/app/src/main/java/com/github/tvbox/osc/bean/SourceBean.java @@ -1,16 +1,8 @@ package com.github.tvbox.osc.bean; -/** - * @author pj567 - * @date :2020/12/18 - * @description: - */ +import java.util.ArrayList; + public class SourceBean { - /** - * name : 最大资源网 - * api : http://www.zdziyuan.com/inc/api.php - * download : http://www.zdziyuan.com/inc/apidown.php - */ private String key; private String name; private String api; @@ -20,6 +12,7 @@ public class SourceBean { private int filterable; // 可筛选? private String playerUrl; // 站点解析Url private String ext; // 扩展数据 + private ArrayList categories = null; // 分类&排序 public String getKey() { return key; @@ -92,4 +85,12 @@ public class SourceBean { public void setExt(String ext) { this.ext = ext; } + + public ArrayList getCategories() { + return categories; + } + + public void setCategories(ArrayList categories) { + this.categories = categories; + } } \ No newline at end of file diff --git a/app/src/main/java/com/github/tvbox/osc/ui/activity/CollectActivity.java b/app/src/main/java/com/github/tvbox/osc/ui/activity/CollectActivity.java index 6a035b6e..b8f07c08 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/activity/CollectActivity.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/activity/CollectActivity.java @@ -2,12 +2,14 @@ package com.github.tvbox.osc.ui.activity; import android.content.Intent; import android.graphics.Color; +import android.os.Bundle; import android.view.View; import android.view.animation.BounceInterpolator; import android.widget.TextView; import com.chad.library.adapter.base.BaseQuickAdapter; import com.github.tvbox.osc.R; +import com.github.tvbox.osc.api.ApiConfig; import com.github.tvbox.osc.base.BaseActivity; import com.github.tvbox.osc.cache.RoomDataManger; import com.github.tvbox.osc.cache.VodCollect; @@ -99,10 +101,17 @@ public class CollectActivity extends BaseActivity { collectAdapter.remove(position); RoomDataManger.deleteVodCollect(vodInfo.getId()); } else { - Intent newIntent = new Intent(mContext, SearchActivity.class); - newIntent.putExtra("title", vodInfo.name); - newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); - startActivity(newIntent); + if (ApiConfig.get().getSource(vodInfo.sourceKey) != null) { + Bundle bundle = new Bundle(); + bundle.putString("id", vodInfo.vodId); + bundle.putString("sourceKey", vodInfo.sourceKey); + jumpActivity(DetailActivity.class, bundle); + } else { + Intent newIntent = new Intent(mContext, SearchActivity.class); + newIntent.putExtra("title", vodInfo.name); + newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(newIntent); + } } } } diff --git a/app/src/main/java/com/github/tvbox/osc/ui/activity/HomeActivity.java b/app/src/main/java/com/github/tvbox/osc/ui/activity/HomeActivity.java index 9b24049b..8aeacbb9 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/activity/HomeActivity.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/activity/HomeActivity.java @@ -27,7 +27,10 @@ import com.github.tvbox.osc.api.ApiConfig; import com.github.tvbox.osc.base.BaseActivity; import com.github.tvbox.osc.base.BaseLazyFragment; import com.github.tvbox.osc.bean.AbsSortXml; +import com.github.tvbox.osc.bean.Movie; import com.github.tvbox.osc.bean.MovieSort; +import com.github.tvbox.osc.bean.VodInfo; +import com.github.tvbox.osc.cache.RoomDataManger; import com.github.tvbox.osc.event.RefreshEvent; import com.github.tvbox.osc.server.ControlManager; import com.github.tvbox.osc.ui.adapter.HomePageAdapter; @@ -41,8 +44,10 @@ import com.github.tvbox.osc.ui.tv.widget.NoScrollViewPager; import com.github.tvbox.osc.ui.tv.widget.ViewObj; import com.github.tvbox.osc.util.AppManager; import com.github.tvbox.osc.util.DefaultConfig; +import com.github.tvbox.osc.util.HawkConfig; import com.github.tvbox.osc.util.LOG; import com.github.tvbox.osc.viewmodel.SourceViewModel; +import com.orhanobut.hawk.Hawk; import com.owen.tvrecyclerview.widget.TvRecyclerView; import com.owen.tvrecyclerview.widget.V7LinearLayoutManager; @@ -185,12 +190,12 @@ public class HomeActivity extends BaseActivity { @Override public void onChanged(AbsSortXml absXml) { showSuccess(); - if (absXml != null && absXml.movieSort != null && absXml.movieSort.sortList != null) { - sortAdapter.setNewData(DefaultConfig.adjustSort(ApiConfig.get().getHomeSourceBean().getKey(), absXml.movieSort.sortList, true)); + if (absXml != null && absXml.classes != null && absXml.classes.sortList != null) { + sortAdapter.setNewData(DefaultConfig.adjustSort(ApiConfig.get().getHomeSourceBean().getKey(), absXml.classes.sortList, true)); } else { sortAdapter.setNewData(DefaultConfig.adjustSort(ApiConfig.get().getHomeSourceBean().getKey(), new ArrayList<>(), true)); } - initViewPager(); + initViewPager(absXml); } }); } @@ -336,11 +341,27 @@ public class HomeActivity extends BaseActivity { }, this); } - private void initViewPager() { + private void initViewPager(AbsSortXml absXml) { if (sortAdapter.getData().size() > 0) { for (MovieSort.SortData data : sortAdapter.getData()) { if (data.id.equals("my0")) { - fragments.add(UserFragment.newInstance()); + if (Hawk.get(HawkConfig.HOME_REC, 0) == 1 && absXml.videoList != null && absXml.videoList.size() > 0) { + fragments.add(UserFragment.newInstance(absXml.videoList)); + } else if (Hawk.get(HawkConfig.HOME_REC, 0) == 2) { + List allVodRecord = RoomDataManger.getAllVodRecord(); + List vodList = new ArrayList<>(); + for (VodInfo vodInfo : allVodRecord) { + Movie.Video vod = new Movie.Video(); + vod.id = vodInfo.id; + vod.sourceKey = vodInfo.sourceKey; + vod.name = vodInfo.name; + vod.note = "上次看到" + vodInfo.playIndex; + vodList.add(vod); + } + fragments.add(UserFragment.newInstance(vodList)); + } else { + fragments.add(UserFragment.newInstance(null)); + } } else { fragments.add(GridFragment.newInstance(data)); } diff --git a/app/src/main/java/com/github/tvbox/osc/ui/activity/SettingActivity.java b/app/src/main/java/com/github/tvbox/osc/ui/activity/SettingActivity.java index de9de2a2..8fe585f4 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/activity/SettingActivity.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/activity/SettingActivity.java @@ -44,6 +44,8 @@ public class SettingActivity extends BaseActivity { private Handler mHandler = new Handler(); private String homeSourceKey; private String currentApi; + private int homeRec; + private int dnsOpt; @Override protected int getLayoutResID() { @@ -106,6 +108,8 @@ public class SettingActivity extends BaseActivity { private void initData() { currentApi = Hawk.get(HawkConfig.API_URL, ""); homeSourceKey = ApiConfig.get().getHomeSourceBean().getKey(); + homeRec = Hawk.get(HawkConfig.HOME_REC, 0); + dnsOpt = Hawk.get(HawkConfig.DOH_URL, 0); List sortList = new ArrayList<>(); sortList.add("设置其他"); sortAdapter.setNewData(sortList); @@ -174,7 +178,9 @@ public class SettingActivity extends BaseActivity { @Override public void onBackPressed() { if ((homeSourceKey != null && !homeSourceKey.equals(Hawk.get(HawkConfig.HOME_API, ""))) || - !currentApi.equals(Hawk.get(HawkConfig.API_URL, ""))) { + !currentApi.equals(Hawk.get(HawkConfig.API_URL, "")) || + homeRec != Hawk.get(HawkConfig.HOME_REC, 0) || + dnsOpt != Hawk.get(HawkConfig.DOH_URL, 0)) { AppManager.getInstance().finishAllActivity(); if (currentApi.equals(Hawk.get(HawkConfig.API_URL, ""))) { Bundle bundle = new Bundle(); diff --git a/app/src/main/java/com/github/tvbox/osc/ui/adapter/HomeHotVodAdapter.java b/app/src/main/java/com/github/tvbox/osc/ui/adapter/HomeHotVodAdapter.java index fa04f3b9..f506f519 100644 --- a/app/src/main/java/com/github/tvbox/osc/ui/adapter/HomeHotVodAdapter.java +++ b/app/src/main/java/com/github/tvbox/osc/ui/adapter/HomeHotVodAdapter.java @@ -8,6 +8,7 @@ import android.widget.TextView; import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.BaseViewHolder; import com.github.tvbox.osc.R; +import com.github.tvbox.osc.bean.Movie; import com.github.tvbox.osc.picasso.RoundTransformation; import com.github.tvbox.osc.util.DefaultConfig; import com.github.tvbox.osc.util.MD5; @@ -17,34 +18,19 @@ import java.util.ArrayList; import me.jessyan.autosize.utils.AutoSizeUtils; -public class HomeHotVodAdapter extends BaseQuickAdapter { - public static class HotVod { - String name; - String rate; - String pic; - - public HotVod(String name, String rate, String pic) { - this.name = name; - this.rate = rate; - this.pic = pic; - } - - public String getName() { - return name; - } - } +public class HomeHotVodAdapter extends BaseQuickAdapter { public HomeHotVodAdapter() { super(R.layout.item_user_hot_vod, new ArrayList<>()); } @Override - protected void convert(BaseViewHolder helper, HotVod item) { + protected void convert(BaseViewHolder helper, Movie.Video item) { TextView tvRate = helper.getView(R.id.tvRate); - if (item.rate == null || item.rate.isEmpty()) { + if (item.note == null || item.note.isEmpty()) { tvRate.setVisibility(View.GONE); } else { - tvRate.setText(item.rate); + tvRate.setText(item.note); } helper.setText(R.id.tvName, item.name); ImageView ivThumb = helper.getView(R.id.ivThumb); 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 59cee482..dc03fbbe 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 @@ -1,6 +1,7 @@ package com.github.tvbox.osc.ui.fragment; import android.content.Intent; +import android.os.Bundle; import android.view.View; import android.view.animation.BounceInterpolator; import android.widget.LinearLayout; @@ -9,8 +10,10 @@ import com.chad.library.adapter.base.BaseQuickAdapter; import com.github.tvbox.osc.R; import com.github.tvbox.osc.api.ApiConfig; import com.github.tvbox.osc.base.BaseLazyFragment; +import com.github.tvbox.osc.bean.Movie; import com.github.tvbox.osc.event.ServerEvent; import com.github.tvbox.osc.ui.activity.CollectActivity; +import com.github.tvbox.osc.ui.activity.DetailActivity; import com.github.tvbox.osc.ui.activity.HistoryActivity; import com.github.tvbox.osc.ui.activity.LivePlayActivity; import com.github.tvbox.osc.ui.activity.PushActivity; @@ -18,6 +21,7 @@ import com.github.tvbox.osc.ui.activity.SearchActivity; import com.github.tvbox.osc.ui.activity.SettingActivity; import com.github.tvbox.osc.ui.adapter.HomeHotVodAdapter; import com.github.tvbox.osc.util.FastClickCheckUtil; +import com.github.tvbox.osc.util.HawkConfig; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonElement; @@ -34,6 +38,7 @@ import org.greenrobot.eventbus.ThreadMode; import java.util.ArrayList; import java.util.Calendar; +import java.util.List; /** * @author pj567 @@ -47,11 +52,22 @@ public class UserFragment extends BaseLazyFragment implements View.OnClickListen private LinearLayout tvHistory; private LinearLayout tvCollect; private LinearLayout tvPush; + private HomeHotVodAdapter homeHotVodAdapter; + private List recVod; public static UserFragment newInstance() { return new UserFragment(); } + public static UserFragment newInstance(List recVod) { + return new UserFragment().setArguments(recVod); + } + + public UserFragment setArguments(List recVod) { + this.recVod = recVod; + return this; + } + @Override protected int getLayoutResID() { return R.layout.fragment_user; @@ -79,17 +95,24 @@ public class UserFragment extends BaseLazyFragment implements View.OnClickListen tvPush.setOnFocusChangeListener(focusChangeListener); tvCollect.setOnFocusChangeListener(focusChangeListener); TvRecyclerView tvHotList = findViewById(R.id.tvHotList); - HomeHotVodAdapter adapter = new HomeHotVodAdapter(); - adapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() { + homeHotVodAdapter = new HomeHotVodAdapter(); + homeHotVodAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() { @Override public void onItemClick(BaseQuickAdapter adapter, View view, int position) { if (ApiConfig.get().getSourceBeanList().isEmpty()) return; - String title = ((HomeHotVodAdapter.HotVod) adapter.getItem(position)).getName(); - Intent newIntent = new Intent(mContext, SearchActivity.class); - newIntent.putExtra("title", title); - newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); - mActivity.startActivity(newIntent); + Movie.Video vod = ((Movie.Video) adapter.getItem(position)); + if (vod.id != null && !vod.id.isEmpty()) { + Bundle bundle = new Bundle(); + bundle.putString("id", vod.id); + bundle.putString("sourceKey", vod.sourceKey); + jumpActivity(DetailActivity.class, bundle); + } else { + Intent newIntent = new Intent(mContext, SearchActivity.class); + newIntent.putExtra("title", vod.name); + newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); + mActivity.startActivity(newIntent); + } } }); tvHotList.setOnItemListener(new TvRecyclerView.OnItemListener() { @@ -108,12 +131,18 @@ public class UserFragment extends BaseLazyFragment implements View.OnClickListen } }); - tvHotList.setAdapter(adapter); + tvHotList.setAdapter(homeHotVodAdapter); - initHomeHotVod(adapter); + initHomeHotVod(homeHotVodAdapter); } private void initHomeHotVod(HomeHotVodAdapter adapter) { + if (Hawk.get(HawkConfig.HOME_REC, 0) != 0) { + if (recVod != null) { + adapter.setNewData(recVod); + } + return; + } try { Calendar cal = Calendar.getInstance(); int year = cal.get(Calendar.YEAR); @@ -152,14 +181,18 @@ public class UserFragment extends BaseLazyFragment implements View.OnClickListen } } - private ArrayList loadHots(String json) { - ArrayList result = new ArrayList<>(); + private ArrayList loadHots(String json) { + ArrayList result = new ArrayList<>(); try { JsonObject infoJson = new Gson().fromJson(json, JsonObject.class); JsonArray array = infoJson.getAsJsonArray("data"); for (JsonElement ele : array) { JsonObject obj = (JsonObject) ele; - result.add(new HomeHotVodAdapter.HotVod(obj.get("title").getAsString(), obj.get("rate").getAsString(), obj.get("cover").getAsString())); + Movie.Video vod = new Movie.Video(); + vod.name = obj.get("title").getAsString(); + vod.note = obj.get("rate").getAsString(); + vod.pic = obj.get("cover").getAsString(); + result.add(vod); } } catch (Throwable th) { diff --git a/app/src/main/java/com/github/tvbox/osc/util/DefaultConfig.java b/app/src/main/java/com/github/tvbox/osc/util/DefaultConfig.java index c93ae4f8..49dc6914 100644 --- a/app/src/main/java/com/github/tvbox/osc/util/DefaultConfig.java +++ b/app/src/main/java/com/github/tvbox/osc/util/DefaultConfig.java @@ -5,7 +5,9 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.text.TextUtils; +import com.github.tvbox.osc.api.ApiConfig; import com.github.tvbox.osc.bean.MovieSort; +import com.github.tvbox.osc.bean.SourceBean; import com.github.tvbox.osc.server.ControlManager; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -25,10 +27,24 @@ public class DefaultConfig { public static List adjustSort(String sourceKey, List list, boolean withMy) { List data = new ArrayList<>(); if (sourceKey != null) { - for (MovieSort.SortData sortData : list) { - if (sortData.filters == null) - sortData.filters = new ArrayList<>(); - data.add(sortData); + SourceBean sb = ApiConfig.get().getSource(sourceKey); + ArrayList categories = sb.getCategories(); + if (!categories.isEmpty()) { + for (String cate : categories) { + for (MovieSort.SortData sortData : list) { + if (sortData.name.equals(cate)) { + if (sortData.filters == null) + sortData.filters = new ArrayList<>(); + data.add(sortData); + } + } + } + } else { + for (MovieSort.SortData sortData : list) { + if (sortData.filters == null) + sortData.filters = new ArrayList<>(); + data.add(sortData); + } } } if (withMy) 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 85af37fb..9115c65d 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 @@ -19,4 +19,5 @@ public class HawkConfig { public static final String PLAY_SCALE = "play_scale"; //0 texture 2 public static final String PLAY_TIME_STEP = "play_time_step"; //0 texture 2 public static final String DOH_URL = "doh_url"; + public static final String HOME_REC = "home_rec"; // 0 豆瓣热播 1 数据源推荐 2 历史 } \ No newline at end of file diff --git a/app/src/main/java/com/github/tvbox/osc/util/OkGoHelper.java b/app/src/main/java/com/github/tvbox/osc/util/OkGoHelper.java index f3342c39..de0e8ecf 100644 --- a/app/src/main/java/com/github/tvbox/osc/util/OkGoHelper.java +++ b/app/src/main/java/com/github/tvbox/osc/util/OkGoHelper.java @@ -6,6 +6,8 @@ import com.lzy.okgo.OkGo; import com.lzy.okgo.https.HttpsUtils; import com.lzy.okgo.interceptor.HttpLoggingInterceptor; import com.orhanobut.hawk.Hawk; +import com.squareup.picasso.OkHttp3Downloader; +import com.squareup.picasso.Picasso; import java.io.File; import java.security.cert.CertificateException; @@ -133,6 +135,13 @@ public class OkGoHelper { OkGo.getInstance().setRetryCount(2); initExoOkHttpClient(); + initPicasso(okHttpClient); + } + + static void initPicasso(OkHttpClient client) { + OkHttp3Downloader downloader = new OkHttp3Downloader(client); + Picasso picasso = new Picasso.Builder(App.getInstance()).downloader(downloader).build(); + Picasso.setSingletonInstance(picasso); } private static synchronized void setOkHttpSsl(OkHttpClient.Builder builder) { diff --git a/app/src/main/java/com/github/tvbox/osc/viewmodel/SourceViewModel.java b/app/src/main/java/com/github/tvbox/osc/viewmodel/SourceViewModel.java index cd119421..52e42c3a 100644 --- a/app/src/main/java/com/github/tvbox/osc/viewmodel/SourceViewModel.java +++ b/app/src/main/java/com/github/tvbox/osc/viewmodel/SourceViewModel.java @@ -1,5 +1,7 @@ package com.github.tvbox.osc.viewmodel; +import android.text.TextUtils; + import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; @@ -14,6 +16,7 @@ import com.github.tvbox.osc.bean.MovieSort; import com.github.tvbox.osc.bean.SourceBean; import com.github.tvbox.osc.event.RefreshEvent; import com.github.tvbox.osc.util.DefaultConfig; +import com.github.tvbox.osc.util.HawkConfig; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonElement; @@ -23,6 +26,7 @@ import com.google.gson.reflect.TypeToken; import com.lzy.okgo.OkGo; import com.lzy.okgo.callback.AbsCallback; import com.lzy.okgo.model.Response; +import com.orhanobut.hawk.Hawk; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.DomDriver; @@ -93,7 +97,18 @@ public class SourceViewModel extends ViewModel { e.printStackTrace(); } finally { if (sortJson != null) { - sortJson(sortResult, sortJson); + AbsSortXml sortXml = sortJson(sortResult, sortJson); + if (sortXml != null && Hawk.get(HawkConfig.HOME_REC, 0) == 1) { + getHomeRecList(sourceBean, null, new HomeRecCallback() { + @Override + public void done(List videos) { + sortXml.videoList = videos; + sortResult.postValue(sortXml); + } + }); + } else { + sortResult.postValue(sortXml); + } } else { sortResult.postValue(null); } @@ -121,12 +136,29 @@ public class SourceViewModel extends ViewModel { @Override public void onSuccess(Response response) { + AbsSortXml sortXml = null; if (type == 0) { String xml = response.body(); - sortXml(sortResult, xml); + sortXml = sortXml(sortResult, xml); } else if (type == 1) { String json = response.body(); - sortJson(sortResult, json); + sortXml = sortJson(sortResult, json); + } + if (sortXml != null && Hawk.get(HawkConfig.HOME_REC, 0) == 1 && sortXml.list != null && sortXml.list.videoList != null && sortXml.list.videoList.size() > 0) { + ArrayList ids = new ArrayList<>(); + for (Movie.Video vod : sortXml.list.videoList) { + ids.add(vod.id); + } + AbsSortXml finalSortXml = sortXml; + getHomeRecList(sourceBean, ids, new HomeRecCallback() { + @Override + public void done(List videos) { + finalSortXml.videoList = videos; + sortResult.postValue(finalSortXml); + } + }); + } else { + sortResult.postValue(sortXml); } } @@ -195,6 +227,95 @@ public class SourceViewModel extends ViewModel { } } + interface HomeRecCallback { + void done(List videos); + } + + void getHomeRecList(SourceBean sourceBean, ArrayList ids, HomeRecCallback callback) { + if (sourceBean.getType() == 3) { + Runnable waitResponse = new Runnable() { + @Override + public void run() { + ExecutorService executor = Executors.newSingleThreadExecutor(); + Future future = executor.submit(new Callable() { + @Override + public String call() throws Exception { + Spider sp = ApiConfig.get().getCSP(sourceBean); + return sp.homeVideoContent(); + } + }); + String sortJson = null; + try { + sortJson = future.get(15, TimeUnit.SECONDS); + } catch (TimeoutException e) { + e.printStackTrace(); + future.cancel(true); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } finally { + if (sortJson != null) { + AbsXml absXml = json(null, sortJson, sourceBean.getKey()); + if (absXml != null && absXml.movie != null && absXml.movie.videoList != null) { + callback.done(absXml.movie.videoList); + } else { + callback.done(null); + } + } else { + callback.done(null); + } + try { + executor.shutdown(); + } catch (Throwable th) { + th.printStackTrace(); + } + } + } + }; + spThreadPool.execute(waitResponse); + } else if (sourceBean.getType() == 0 || sourceBean.getType() == 1) { + OkGo.get(sourceBean.getApi()) + .tag("detail") + .params("ac", sourceBean.getType() == 0 ? "videolist" : "detail") + .params("ids", TextUtils.join(",", ids)) + .execute(new AbsCallback() { + + @Override + public String convertResponse(okhttp3.Response response) throws Throwable { + if (response.body() != null) { + return response.body().string(); + } else { + throw new IllegalStateException("网络请求错误"); + } + } + + @Override + public void onSuccess(Response response) { + AbsXml absXml; + if (sourceBean.getType() == 0) { + String xml = response.body(); + absXml = xml(null, xml, sourceBean.getKey()); + } else { + String json = response.body(); + absXml = json(null, json, sourceBean.getKey()); + } + if (absXml != null && absXml.movie != null && absXml.movie.videoList != null) { + callback.done(absXml.movie.videoList); + } else { + callback.done(null); + } + } + + @Override + public void onError(Response response) { + super.onError(response); + callback.done(null); + } + }); + } else { + callback.done(null); + } + } + public void getDetail(String sourceKey, String id) { SourceBean sourceBean = ApiConfig.get().getSource(sourceKey); int type = sourceBean.getType(); @@ -407,7 +528,7 @@ public class SourceViewModel extends ViewModel { return filter; } - private void sortJson(MutableLiveData result, String json) { + private AbsSortXml sortJson(MutableLiveData result, String json) { try { JsonObject obj = JsonParser.parseString(json).getAsJsonObject(); AbsSortJson sortJson = new Gson().fromJson(obj, new TypeToken() { @@ -429,7 +550,7 @@ public class SourceViewModel extends ViewModel { } sortFilters.put(key, sortFilter); } - for (MovieSort.SortData sort : data.movieSort.sortList) { + for (MovieSort.SortData sort : data.classes.sortList) { if (sortFilters.containsKey(sort.id) && sortFilters.get(sort.id) != null) { sort.filters = sortFilters.get(sort.id); } @@ -438,22 +559,27 @@ public class SourceViewModel extends ViewModel { } catch (Throwable th) { } - result.postValue(data); + return data; } catch (Exception e) { - result.postValue(null); + return null; } } - private void sortXml(MutableLiveData result, String xml) { + private AbsSortXml sortXml(MutableLiveData result, String xml) { try { XStream xstream = new XStream(new DomDriver());//创建Xstram对象 xstream.autodetectAnnotations(true); xstream.processAnnotations(AbsSortXml.class); xstream.ignoreUnknownElements(); AbsSortXml data = (AbsSortXml) xstream.fromXML(xml); - result.postValue(data); + for (MovieSort.SortData sort : data.classes.sortList) { + if (sort.filters == null) { + sort.filters = new ArrayList<>(); + } + } + return data; } catch (Exception e) { - result.postValue(null); + return null; } } @@ -486,7 +612,7 @@ public class SourceViewModel extends ViewModel { } } - private void xml(MutableLiveData result, String xml, String sourceKey) { + private AbsXml xml(MutableLiveData result, String xml, String sourceKey) { try { XStream xstream = new XStream(new DomDriver());//创建Xstram对象 xstream.autodetectAnnotations(true); @@ -504,21 +630,23 @@ public class SourceViewModel extends ViewModel { EventBus.getDefault().post(new RefreshEvent(RefreshEvent.TYPE_SEARCH_RESULT, data)); } else if (quickSearchResult == result) { EventBus.getDefault().post(new RefreshEvent(RefreshEvent.TYPE_QUICK_SEARCH_RESULT, data)); - } else { + } else if (result != null) { result.postValue(data); } + return data; } catch (Exception e) { if (searchResult == result) { EventBus.getDefault().post(new RefreshEvent(RefreshEvent.TYPE_SEARCH_RESULT, null)); } else if (quickSearchResult == result) { EventBus.getDefault().post(new RefreshEvent(RefreshEvent.TYPE_QUICK_SEARCH_RESULT, null)); - } else { + } else if (result != null) { result.postValue(null); } + return null; } } - private void json(MutableLiveData result, String json, String sourceKey) { + private AbsXml json(MutableLiveData result, String json, String sourceKey) { try { AbsJson absJson = new Gson().fromJson(json, new TypeToken() { }.getType()); @@ -528,17 +656,19 @@ public class SourceViewModel extends ViewModel { EventBus.getDefault().post(new RefreshEvent(RefreshEvent.TYPE_SEARCH_RESULT, data)); } else if (quickSearchResult == result) { EventBus.getDefault().post(new RefreshEvent(RefreshEvent.TYPE_QUICK_SEARCH_RESULT, data)); - } else { + } else if (result != null) { result.postValue(data); } + return data; } catch (Exception e) { if (searchResult == result) { EventBus.getDefault().post(new RefreshEvent(RefreshEvent.TYPE_SEARCH_RESULT, null)); } else if (quickSearchResult == result) { EventBus.getDefault().post(new RefreshEvent(RefreshEvent.TYPE_QUICK_SEARCH_RESULT, null)); - } else { + } else if (result != null) { result.postValue(null); } + return null; } } diff --git a/app/src/main/res/layout/fragment_model.xml b/app/src/main/res/layout/fragment_model.xml index 0dbb1499..1c3516e0 100644 --- a/app/src/main/res/layout/fragment_model.xml +++ b/app/src/main/res/layout/fragment_model.xml @@ -152,6 +152,100 @@ android:textSize="@dimen/ts_30" /> + + + + + + + + + + + + + + + + + + + + + + + + +