Support m3u parser

pull/123/head
FongMi 3 years ago
parent 0ca762108f
commit 3132b0b7cd
  1. 3
      app/src/leanback/java/com/fongmi/android/tv/ui/presenter/ChannelPresenter.java
  2. 3
      app/src/leanback/java/com/fongmi/android/tv/ui/presenter/GroupPresenter.java
  3. 2
      app/src/leanback/res/layout/adapter_channel.xml
  4. 2
      app/src/leanback/res/layout/adapter_group.xml
  5. 2
      app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java
  6. 56
      app/src/main/java/com/fongmi/android/tv/api/LiveConfig.java
  7. 37
      app/src/main/java/com/fongmi/android/tv/bean/Channel.java
  8. 28
      app/src/main/java/com/fongmi/android/tv/bean/Group.java
  9. 7
      app/src/main/java/com/fongmi/android/tv/bean/Live.java
  10. 6
      app/src/main/java/com/fongmi/android/tv/utils/ImgUtil.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));
}

@ -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));
}

@ -26,7 +26,7 @@
tools:text="01" />
<ImageView
android:id="@+id/icon"
android:id="@+id/logo"
android:layout_width="48dp"
android:layout_height="36dp"
android:layout_marginEnd="12dp"

@ -14,7 +14,7 @@
android:paddingBottom="12dp">
<ImageView
android:id="@+id/icon"
android:id="@+id/logo"
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_marginEnd="12dp"

@ -126,7 +126,7 @@ public class ApiConfig {
private void parseConfig(JsonObject object, Callback callback) {
try {
parseJson(object);
LiveConfig.get().parseJson(object);
LiveConfig.get().parse(object);
jLoader.parseJar("", Json.safeString(object, "spider", ""));
config.json(object.toString()).update();
handler.post(callback::success);

@ -82,8 +82,8 @@ public class LiveConfig {
private void parseConfig(String json, Callback callback) {
try {
if (!Json.valid(json)) parseTxt(json);
else parseJson(JsonParser.parseString(json).getAsJsonObject());
if (!Json.valid(json)) parse(json);
else parse(JsonParser.parseString(json).getAsJsonObject());
handler.post(callback::success);
} catch (Exception e) {
e.printStackTrace();
@ -91,23 +91,35 @@ public class LiveConfig {
}
}
private void parseTxt(String txt) {
private String getText(String url) throws Exception {
if (url.startsWith("file")) return FileUtil.read(url);
else if (url.startsWith("http")) return OKHttp.newCall(url).execute().body().string();
else if (url.length() % 4 == 0) return getText(new String(Base64.decode(url, Base64.DEFAULT)));
else return "";
}
private void addLive(Live live) {
lives.remove(live);
lives.add(live);
}
private void parse(String text) {
Live live = new Live(config.getUrl());
parse(live, txt);
LiveParser.start(live, text);
addLive(live);
setHome(live);
}
public void parseJson(JsonObject object) {
public void parse(JsonObject object) {
if (!object.has("lives")) return;
for (JsonElement element : Json.safeListElement(object, "lives")) parse(Live.objectFrom(element));
if (home == null) setHome(lives.isEmpty() ? new Live() : lives.get(0));
}
public void parse(Live live) {
private void parse(Live live) {
try {
if (live.isProxy()) live = new Live(live.getChannels().get(0).getName(), live.getChannels().get(0).getUrls().get(0).split("ext=")[1]);
if (live.getType() == 0) parse(live, getTxt(live.getUrl()));
if (live.getType() == 0) LiveParser.start(live, getText(live.getUrl()));
if (live.getGroups().size() > 0) addLive(live);
if (live.getName().equals(config.getHome())) setHome(live);
} catch (Exception e) {
@ -115,36 +127,6 @@ public class LiveConfig {
}
}
private void addLive(Live live) {
lives.remove(live);
lives.add(live);
}
private String getTxt(String url) throws Exception {
if (url.startsWith("file")) return FileUtil.read(url);
else if (url.startsWith("http")) return OKHttp.newCall(url).execute().body().string();
else if (url.length() % 4 == 0) return getTxt(new String(Base64.decode(url, Base64.DEFAULT)));
else return "";
}
private void parse(Live live, String txt) {
int number = 0;
for (String line : txt.split("\n")) {
String[] split = line.split(",");
if (split.length < 2) continue;
if (line.contains("#genre#")) {
live.getGroups().add(new Group(split[0]));
}
if (split[1].contains("://")) {
Group group = live.getGroups().get(live.getGroups().size() - 1);
Channel channel = new Channel(split[0], split[1].split("#"));
int index = group.getChannel().indexOf(channel);
if (index != -1) group.getChannel().get(index).getUrls().addAll(channel.getUrls());
else group.getChannel().add(channel.setNumber(++number));
}
}
}
public void setKeep(Group group, Channel channel) {
Prefers.putKeep(home.getName() + AppDatabase.SYMBOL + group.getName() + AppDatabase.SYMBOL + channel.getName());
}

@ -5,8 +5,9 @@ import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import com.fongmi.android.tv.App;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.utils.ImgUtil;
import com.fongmi.android.tv.utils.ResUtil;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
@ -14,7 +15,6 @@ import com.google.gson.annotations.SerializedName;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
@ -26,8 +26,8 @@ public class Channel {
private List<String> 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<String> urls) {
public Channel(String name) {
this.name = name;
this.urls = urls;
}
public List<String> getUrls() {
return urls;
return urls = urls == null ? new ArrayList<>() : urls;
}
public void setUrls(List<String> 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() {

@ -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> 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();

@ -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;

@ -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<Bitmap> getListener(ImageView view) {

Loading…
Cancel
Save