Optimize episode find

release
FongMi 4 months ago
parent 52653e995a
commit edf6589027
  1. 2
      app/src/main/java/com/fongmi/android/tv/bean/Episode.java
  2. 25
      app/src/main/java/com/fongmi/android/tv/bean/Flag.java
  3. 17
      app/src/main/java/com/fongmi/android/tv/utils/Util.java

@ -97,7 +97,7 @@ public class Episode implements Parcelable, Diffable<Episode> {
}
public boolean rule2(int number) {
return getNumber() == number && number != -1;
return getNumber() == number;
}
public boolean rule3(String name) {

@ -3,6 +3,7 @@ package com.fongmi.android.tv.bean;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
import android.util.Pair;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@ -17,7 +18,7 @@ import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Text;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
@ -105,16 +106,24 @@ public class Flag implements Parcelable, Diffable<Flag> {
for (int i = 0; i < getEpisodes().size(); i++) getEpisodes().get(i).setActivated(i == getPosition());
}
private int getScore(Episode episode, String remarks, int number) {
if (episode.rule1(remarks)) return 100;
if (number != -1 && episode.rule2(number)) return 80;
if (number == -1 && episode.rule3(remarks)) return 70;
if (number == -1 && episode.rule4(remarks)) return 60;
return 0;
}
public Episode find(String remarks, boolean strict) {
int number = Util.getDigit(remarks);
if (getEpisodes().isEmpty()) return null;
if (getEpisodes().size() == 1) return getEpisodes().get(0);
for (Episode item : getEpisodes()) if (item.rule1(remarks)) return item;
for (Episode item : getEpisodes()) if (item.rule2(number)) return item;
if (number == -1) for (Episode item : getEpisodes()) if (item.rule3(remarks)) return item;
if (number == -1) for (Episode item : getEpisodes()) if (item.rule4(remarks)) return item;
if (getPosition() != -1) return getEpisodes().get(getPosition());
return strict ? null : getEpisodes().get(0);
int number = Util.getDigit(remarks);
return getEpisodes().stream()
.map(episode -> new Pair<>(episode, getScore(episode, remarks, number)))
.filter(pair -> pair.second > 0)
.max(Comparator.comparingInt(pair -> pair.second))
.map(pair -> pair.first)
.orElseGet(() -> getPosition() != -1 ? getEpisodes().get(getPosition()) : strict ? null : getEpisodes().get(0));
}
public void setEpisodes(String url) {

@ -33,6 +33,8 @@ import java.util.ArrayList;
import java.util.Date;
import java.util.Formatter;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Util {
@ -102,12 +104,15 @@ public class Util {
}
public static int getDigit(String text) {
try {
if (text.startsWith("上") || text.startsWith("下")) return -1;
return Integer.parseInt(text.replaceAll("(?i)(mp4|H264|H265|720p|1080p|2160p|4K)", "").replaceAll("\\D+", ""));
} catch (Exception e) {
return -1;
}
if (text == null || text.isBlank()) return -1;
text = text.replaceAll("\\[.*?\\]|\\(.*?\\)", "");
text = text.replaceAll("\\b(19|20)\\d{2}\\b", "");
text = text.toLowerCase().replaceAll("2160p|1080p|720p|480p|4k|h26[45]|x26[45]|mp4", "");
Matcher m = Pattern.compile("(?i)(?:ep|第|e|[\\-\\.\\s]|^)\\s?(\\d+)").matcher(text.trim());
if (m.find()) return Integer.parseInt(m.group(1));
String number = text.replaceAll("\\D+", "");
if (!number.isEmpty()) return Integer.parseInt(number);
return -1;
}
public static String clean(String text) {

Loading…
Cancel
Save