From edf6589027cfa6753f6ba87cf4379a47ccb9a7eb Mon Sep 17 00:00:00 2001 From: FongMi Date: Fri, 19 Dec 2025 19:54:51 +0800 Subject: [PATCH] Optimize episode find --- .../com/fongmi/android/tv/bean/Episode.java | 2 +- .../java/com/fongmi/android/tv/bean/Flag.java | 25 +++++++++++++------ .../com/fongmi/android/tv/utils/Util.java | 17 ++++++++----- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Episode.java b/app/src/main/java/com/fongmi/android/tv/bean/Episode.java index ab132f4f7..7b5399a48 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Episode.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Episode.java @@ -97,7 +97,7 @@ public class Episode implements Parcelable, Diffable { } public boolean rule2(int number) { - return getNumber() == number && number != -1; + return getNumber() == number; } public boolean rule3(String name) { diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Flag.java b/app/src/main/java/com/fongmi/android/tv/bean/Flag.java index 0eb65a10b..358857b0d 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Flag.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Flag.java @@ -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 { 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) { diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Util.java b/app/src/main/java/com/fongmi/android/tv/utils/Util.java index 06b5def1a..245cf9049 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/Util.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/Util.java @@ -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) {