From 3132b0b7cd23cabe443355d06751adf765bb456f Mon Sep 17 00:00:00 2001 From: FongMi Date: Wed, 26 Oct 2022 23:34:28 +0800 Subject: [PATCH] Support m3u parser --- .../tv/ui/presenter/ChannelPresenter.java | 3 +- .../tv/ui/presenter/GroupPresenter.java | 3 +- .../leanback/res/layout/adapter_channel.xml | 2 +- app/src/leanback/res/layout/adapter_group.xml | 2 +- .../com/fongmi/android/tv/api/ApiConfig.java | 2 +- .../com/fongmi/android/tv/api/LiveConfig.java | 56 +++++++------------ .../com/fongmi/android/tv/bean/Channel.java | 37 ++++++------ .../com/fongmi/android/tv/bean/Group.java | 28 ++++++---- .../java/com/fongmi/android/tv/bean/Live.java | 7 +++ .../com/fongmi/android/tv/utils/ImgUtil.java | 6 +- 10 files changed, 72 insertions(+), 74 deletions(-) diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/ChannelPresenter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/ChannelPresenter.java index d96420f6a..d0f3d3192 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/ChannelPresenter.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/ChannelPresenter.java @@ -30,9 +30,10 @@ public class ChannelPresenter extends Presenter { public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object object) { Channel item = (Channel) object; ViewHolder holder = (ViewHolder) viewHolder; + item.loadLogo(holder.binding.logo); holder.binding.name.setText(item.getName()); holder.binding.number.setText(item.getNumber()); - holder.binding.icon.setVisibility(item.getVisible()); + holder.binding.logo.setVisibility(item.getVisible()); holder.binding.getRoot().setSelected(item.isSelected()); setOnClickListener(holder, view -> mListener.onItemClick(item)); } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/GroupPresenter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/GroupPresenter.java index 5a417e6d8..4b1d75a0c 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/GroupPresenter.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/GroupPresenter.java @@ -30,8 +30,9 @@ public class GroupPresenter extends Presenter { public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object object) { Group item = (Group) object; ViewHolder holder = (ViewHolder) viewHolder; + item.loadLogo(holder.binding.logo); holder.binding.name.setText(item.getName()); - holder.binding.icon.setVisibility(item.getVisible()); + holder.binding.logo.setVisibility(item.getVisible()); holder.binding.getRoot().setSelected(item.isSelected()); setOnClickListener(holder, view -> mListener.onItemClick(item)); } diff --git a/app/src/leanback/res/layout/adapter_channel.xml b/app/src/leanback/res/layout/adapter_channel.xml index 11453f432..e9560f294 100644 --- a/app/src/leanback/res/layout/adapter_channel.xml +++ b/app/src/leanback/res/layout/adapter_channel.xml @@ -26,7 +26,7 @@ tools:text="01" /> urls; @SerializedName("number") private String number; - @SerializedName("icon") - private String icon; + @SerializedName("logo") + private String logo; @SerializedName("name") private String name; @SerializedName("ua") @@ -47,23 +47,18 @@ public class Channel { } public static Channel create(String name) { - return new Channel(name, Collections.emptyList()); + return new Channel(name); } public Channel() { } - public Channel(String name, String... urls) { - this(name, new ArrayList<>(Arrays.asList(urls))); - } - - public Channel(String name, List urls) { + public Channel(String name) { this.name = name; - this.urls = urls; } public List getUrls() { - return urls; + return urls = urls == null ? new ArrayList<>() : urls; } public void setUrls(List urls) { @@ -78,12 +73,12 @@ public class Channel { this.number = number; } - public String getIcon() { - return TextUtils.isEmpty(icon) ? "" : icon; + public String getLogo() { + return TextUtils.isEmpty(logo) ? "" : logo; } - public void setIcon(String icon) { - this.icon = icon; + public void setLogo(String logo) { + this.logo = logo; } public String getName() { @@ -135,11 +130,15 @@ public class Channel { } public int getVisible() { - return getIcon().isEmpty() ? View.GONE : View.VISIBLE; + return getLogo().isEmpty() ? View.GONE : View.VISIBLE; + } + + public void loadLogo(ImageView view) { + if (!getLogo().isEmpty()) Glide.with(App.get()).load(getLogo()).into(view); } - public void loadIcon(ImageView view) { - if (!getIcon().isEmpty()) ImgUtil.load(getIcon(), view); + public void addUrls(String... urls) { + getUrls().addAll(new ArrayList<>(Arrays.asList(urls))); } public boolean isLastLine() { diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Group.java b/app/src/main/java/com/fongmi/android/tv/bean/Group.java index 69d4a5b4b..fcd842fe3 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Group.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Group.java @@ -4,7 +4,8 @@ import android.text.TextUtils; import android.view.View; import android.widget.ImageView; -import com.fongmi.android.tv.utils.ImgUtil; +import com.bumptech.glide.Glide; +import com.fongmi.android.tv.App; import com.google.gson.annotations.SerializedName; import java.util.ArrayList; @@ -14,8 +15,8 @@ public class Group { @SerializedName("channel") private List channel; - @SerializedName("icon") - private String icon; + @SerializedName("logo") + private String logo; @SerializedName("name") private String name; @SerializedName("pass") @@ -37,12 +38,12 @@ public class Group { this.channel = channel; } - public String getIcon() { - return TextUtils.isEmpty(icon) ? "" : icon; + public String getLogo() { + return TextUtils.isEmpty(logo) ? "" : logo; } - public void setIcon(String icon) { - this.icon = icon; + public void setLogo(String logo) { + this.logo = logo; } public String getName() { @@ -82,11 +83,11 @@ public class Group { } public int getVisible() { - return getIcon().isEmpty() ? View.GONE : View.VISIBLE; + return getLogo().isEmpty() ? View.GONE : View.VISIBLE; } - public void loadIcon(ImageView view) { - if (!getIcon().isEmpty()) ImgUtil.load(getIcon(), view); + public void loadLogo(ImageView view) { + if (!getLogo().isEmpty()) Glide.with(App.get()).load(getLogo()).into(view); } public int find(int number) { @@ -97,6 +98,13 @@ public class Group { return getChannel().lastIndexOf(Channel.create(name)); } + public Channel find(Channel channel) { + int index = getChannel().indexOf(channel); + if (index != -1) return getChannel().get(index); + getChannel().add(channel); + return channel; + } + public Channel next() { setPosition(getPosition() < getChannel().size() - 1 ? getPosition() + 1 : 0); return current(); diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Live.java b/app/src/main/java/com/fongmi/android/tv/bean/Live.java index 5fba5ae02..d94db0b7d 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Live.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Live.java @@ -107,6 +107,13 @@ public class Live { return getGroup().equals("redirect") && getChannels().size() > 0 && getChannels().get(0).getUrls().size() > 0 && getChannels().get(0).getUrls().get(0).startsWith("proxy"); } + public Group find(Group group) { + int index = getGroups().indexOf(group); + if (index != -1) return getGroups().get(index); + getGroups().add(group); + return group; + } + @Override public boolean equals(Object obj) { if (this == obj) return true; diff --git a/app/src/main/java/com/fongmi/android/tv/utils/ImgUtil.java b/app/src/main/java/com/fongmi/android/tv/utils/ImgUtil.java index f3bd71e8c..a10f2d9e2 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/ImgUtil.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/ImgUtil.java @@ -17,10 +17,10 @@ import com.fongmi.android.tv.R; public class ImgUtil { - public static void load(String vodPic, ImageView view) { + public static void load(String url, ImageView view) { view.setScaleType(ImageView.ScaleType.CENTER); - if (TextUtils.isEmpty(vodPic)) view.setImageResource(R.drawable.ic_img_error); - else Glide.with(App.get()).asBitmap().load(vodPic).skipMemoryCache(true).sizeMultiplier(Prefers.getThumbnail()).signature(new ObjectKey(vodPic + "_" + Prefers.getQuality())).placeholder(R.drawable.ic_img_loading).listener(getListener(view)).into(view); + if (TextUtils.isEmpty(url)) view.setImageResource(R.drawable.ic_img_error); + else Glide.with(App.get()).asBitmap().load(url).skipMemoryCache(true).sizeMultiplier(Prefers.getThumbnail()).signature(new ObjectKey(url + "_" + Prefers.getQuality())).placeholder(R.drawable.ic_img_loading).listener(getListener(view)).into(view); } private static RequestListener getListener(ImageView view) {