From 440275996df8041418d585994f8be475ad65fa63 Mon Sep 17 00:00:00 2001 From: FongMi Date: Tue, 8 Nov 2022 00:08:20 +0800 Subject: [PATCH] Support live epg - part 1 --- .../android/tv/ui/activity/LiveActivity.java | 45 +++++++++-- .../com/fongmi/android/tv/api/LiveConfig.java | 1 + .../com/fongmi/android/tv/bean/Channel.java | 9 +++ .../java/com/fongmi/android/tv/bean/Epg.java | 79 +++++++++++++++++++ .../com/fongmi/android/tv/utils/Utils.java | 9 +++ 5 files changed, 135 insertions(+), 8 deletions(-) diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java index 7b6fc5192..3082df4db 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java @@ -18,12 +18,15 @@ import com.fongmi.android.tv.App; import com.fongmi.android.tv.R; import com.fongmi.android.tv.api.LiveConfig; import com.fongmi.android.tv.bean.Channel; +import com.fongmi.android.tv.bean.Epg; import com.fongmi.android.tv.bean.Group; import com.fongmi.android.tv.bean.Keep; import com.fongmi.android.tv.databinding.ActivityLiveBinding; import com.fongmi.android.tv.event.PlayerEvent; import com.fongmi.android.tv.impl.PassCallback; import com.fongmi.android.tv.model.LiveViewModel; +import com.fongmi.android.tv.net.Callback; +import com.fongmi.android.tv.net.OKHttp; import com.fongmi.android.tv.player.Players; import com.fongmi.android.tv.player.source.Force; import com.fongmi.android.tv.ui.custom.CustomKeyDownLive; @@ -41,18 +44,24 @@ import com.google.android.exoplayer2.ui.StyledPlayerView; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; +import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Date; import java.util.List; import java.util.Locale; +import okhttp3.Call; +import okhttp3.Response; + public class LiveActivity extends BaseActivity implements GroupPresenter.OnClickListener, ChannelPresenter.OnClickListener, CustomKeyDownLive.Listener, CustomLiveListView.Callback, PassCallback { private ActivityLiveBinding mBinding; private ArrayObjectAdapter mChannelAdapter; private ArrayObjectAdapter mGroupAdapter; + private SimpleDateFormat mFormatDate; + private SimpleDateFormat mFormatTime; private CustomKeyDownLive mKeyDown; - private SimpleDateFormat mFormat; private LiveViewModel mViewModel; private List mHides; private Players mPlayers; @@ -96,7 +105,8 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick mR2 = this::setChannelActivated; mPlayers = new Players().init(); mKeyDown = CustomKeyDownLive.create(this); - mFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); + mFormatDate = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); + mFormatTime = new SimpleDateFormat("yyyy-MM-ddHH:mm", Locale.getDefault()); mHides = new ArrayList<>(); setRecyclerView(); setViewModel(); @@ -207,21 +217,40 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick mBinding.info.line.setText(mChannel.getLineText()); mBinding.info.number.setText(mChannel.getNumber()); mBinding.info.getRoot().setVisibility(View.VISIBLE); - getEpg(); + checkEpg(); } private void resetPass() { this.count = 0; } - private void getEpg() { - /*String epg = mChannel.getEpg().replace("{date}", mFormat.format(new Date())); - OKHttp.newCall(epg).enqueue(new Callback(){ + private void checkEpg() { + if (mChannel.getEpg().isEmpty()) return; + String date = mFormatDate.format(new Date()); + String epg = mChannel.getEpg().replace("{date}", date); + if (mChannel.getData().equal(date)) showEpg(); + else getEpg(epg, mChannel); + } + + private void getEpg(String epg, Channel channel) { + OKHttp.newCall(epg).enqueue(new Callback() { @Override public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException { - Log.e("DDD", response.body().string()); + channel.setData(Epg.objectFrom(response.body().string())); + channel.getData().initTime(mFormatTime); + if (mChannel.equals(channel)) App.post(() -> showEpg()); } - });*/ + }); + } + + private void showEpg() { + Date now = new Date(); + for (Epg epg : mChannel.getData().getList()) { + if (epg.getStartTime() <= now.getTime() && now.getTime() <= epg.getEndTime()) { + mBinding.info.play.setText(epg.getTitle()); + break; + } + } } @Override diff --git a/app/src/main/java/com/fongmi/android/tv/api/LiveConfig.java b/app/src/main/java/com/fongmi/android/tv/api/LiveConfig.java index da5dd782f..f9856e7e3 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/LiveConfig.java +++ b/app/src/main/java/com/fongmi/android/tv/api/LiveConfig.java @@ -184,5 +184,6 @@ public class LiveConfig { this.home.setActivated(true); config.home(home.getName()).update(); for (Live item : lives) item.setActivated(home); + App.execute(() -> LiveParser.start(home, getText(home.getUrl()))); } } diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Channel.java b/app/src/main/java/com/fongmi/android/tv/bean/Channel.java index 49bf33a9b..5f5d0d6d4 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Channel.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Channel.java @@ -38,6 +38,7 @@ public class Channel { private boolean selected; private Group group; private String url; + private Epg data; private int line; public static Channel objectFrom(JsonElement element) { @@ -127,6 +128,14 @@ public class Channel { this.url = url; } + public Epg getData() { + return data == null ? new Epg() : data; + } + + public void setData(Epg data) { + this.data = data; + } + public int getLine() { return line; } diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Epg.java b/app/src/main/java/com/fongmi/android/tv/bean/Epg.java index 52069e5c6..f9b83f541 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Epg.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Epg.java @@ -1,4 +1,83 @@ package com.fongmi.android.tv.bean; +import android.text.TextUtils; + +import com.fongmi.android.tv.utils.Utils; +import com.google.gson.Gson; +import com.google.gson.annotations.SerializedName; + +import java.text.SimpleDateFormat; +import java.util.Collections; +import java.util.List; + public class Epg { + + @SerializedName("date") + private String date; + @SerializedName("epg_data") + private List list; + @SerializedName("title") + private String title; + @SerializedName("start") + private String start; + @SerializedName("end") + private String end; + + private long startTime; + private long endTime; + + public static Epg objectFrom(String str) { + try { + return new Gson().fromJson(str, Epg.class); + } catch (Exception e) { + return new Epg(); + } + } + + public String getDate() { + return TextUtils.isEmpty(date) ? "" : date; + } + + public List getList() { + return list == null ? Collections.emptyList() : list; + } + + public String getTitle() { + return TextUtils.isEmpty(title) ? "" : title; + } + + public String getStart() { + return TextUtils.isEmpty(start) ? "" : start; + } + + public String getEnd() { + return TextUtils.isEmpty(end) ? "" : end; + } + + public long getStartTime() { + return startTime; + } + + public void setStartTime(long startTime) { + this.startTime = startTime; + } + + public long getEndTime() { + return endTime; + } + + public void setEndTime(long endTime) { + this.endTime = endTime; + } + + public boolean equal(String date) { + return getDate().equals(date); + } + + public void initTime(SimpleDateFormat format) { + for (Epg epg : getList()) { + epg.setStartTime(Utils.format(format, getDate().concat(epg.getStart()))); + epg.setEndTime(Utils.format(format, getDate().concat(epg.getEnd()))); + } + } } diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Utils.java b/app/src/main/java/com/fongmi/android/tv/utils/Utils.java index 8437cae5d..991866854 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/Utils.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/Utils.java @@ -17,6 +17,7 @@ import com.google.android.exoplayer2.util.Util; import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -132,6 +133,14 @@ public class Utils { return text; } + public static long format(SimpleDateFormat format, String src) { + try { + return format.parse(src).getTime(); + } catch (Exception e) { + return 0; + } + } + public static int getDigit(String text) { try { if (text.startsWith("上") || text.startsWith("下")) return -1;