mirror of
https://github.com/mitb-archive/filebot
synced 2024-08-13 17:03:45 -04:00
* optimize subtitle collection
This commit is contained in:
parent
060229757a
commit
9e4b38ea9a
@ -828,7 +828,7 @@ public class CmdlineOperations implements CmdlineInterface {
|
||||
|
||||
private Map<File, SubtitleDescriptor> lookupSubtitleByFileName(SubtitleProvider service, Collection<String> querySet, Language language, Collection<File> videoFiles, boolean strict) throws Exception {
|
||||
// search for subtitles
|
||||
List<SubtitleDescriptor> subtitles = findSubtitles(service, querySet, language.getName());
|
||||
Set<SubtitleDescriptor> subtitles = findSubtitles(service, querySet, language.getName());
|
||||
|
||||
// match subtitle files to video files
|
||||
if (subtitles.size() > 0) {
|
||||
|
@ -1,19 +1,20 @@
|
||||
|
||||
package net.sourceforge.filebot.similarity;
|
||||
|
||||
|
||||
import static java.lang.Math.*;
|
||||
|
||||
|
||||
public class MetricCascade implements SimilarityMetric {
|
||||
|
||||
private final SimilarityMetric[] cascade;
|
||||
|
||||
private final boolean shortCircuit;
|
||||
|
||||
public MetricCascade(SimilarityMetric... cascade) {
|
||||
this.cascade = cascade;
|
||||
this(true, cascade);
|
||||
}
|
||||
|
||||
public MetricCascade(boolean shortCircuit, SimilarityMetric... cascade) {
|
||||
this.cascade = cascade;
|
||||
this.shortCircuit = shortCircuit;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getSimilarity(Object o1, Object o2) {
|
||||
@ -22,8 +23,12 @@ public class MetricCascade implements SimilarityMetric {
|
||||
float similarity = metric.getSimilarity(o1, o2);
|
||||
if (abs(similarity) >= abs(f)) {
|
||||
// perfect match, ignore remaining metrics
|
||||
if (similarity >= 1) {
|
||||
return similarity;
|
||||
if (shortCircuit) {
|
||||
if (similarity >= 1) {
|
||||
return similarity;
|
||||
} else if (similarity <= -1) {
|
||||
return similarity;
|
||||
}
|
||||
}
|
||||
|
||||
// possible match or perfect negative match
|
||||
|
@ -1,7 +1,5 @@
|
||||
|
||||
package net.sourceforge.filebot.subtitle;
|
||||
|
||||
|
||||
import static java.lang.Math.*;
|
||||
import static net.sourceforge.filebot.MediaTypes.*;
|
||||
import static net.sourceforge.filebot.media.MediaDetection.*;
|
||||
@ -26,6 +24,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import net.sourceforge.filebot.Language;
|
||||
import net.sourceforge.filebot.similarity.Match;
|
||||
import net.sourceforge.filebot.similarity.Matcher;
|
||||
import net.sourceforge.filebot.similarity.MetricAvg;
|
||||
@ -33,14 +32,12 @@ import net.sourceforge.filebot.similarity.MetricCascade;
|
||||
import net.sourceforge.filebot.similarity.NameSimilarityMetric;
|
||||
import net.sourceforge.filebot.similarity.SequenceMatchSimilarity;
|
||||
import net.sourceforge.filebot.similarity.SimilarityMetric;
|
||||
import net.sourceforge.filebot.Language;
|
||||
import net.sourceforge.filebot.vfs.ArchiveType;
|
||||
import net.sourceforge.filebot.vfs.MemoryFile;
|
||||
import net.sourceforge.filebot.web.SearchResult;
|
||||
import net.sourceforge.filebot.web.SubtitleDescriptor;
|
||||
import net.sourceforge.filebot.web.SubtitleProvider;
|
||||
|
||||
|
||||
public final class SubtitleUtilities {
|
||||
|
||||
public static Map<File, SubtitleDescriptor> matchSubtitles(Collection<File> files, Collection<SubtitleDescriptor> subtitles, boolean strict) throws InterruptedException {
|
||||
@ -75,9 +72,8 @@ public final class SubtitleUtilities {
|
||||
return subtitleByVideo;
|
||||
}
|
||||
|
||||
|
||||
public static List<SubtitleDescriptor> findSubtitles(SubtitleProvider service, Collection<String> querySet, String languageName) throws Exception {
|
||||
List<SubtitleDescriptor> subtitles = new ArrayList<SubtitleDescriptor>();
|
||||
public static Set<SubtitleDescriptor> findSubtitles(SubtitleProvider service, Collection<String> querySet, String languageName) throws Exception {
|
||||
Set<SubtitleDescriptor> subtitles = new LinkedHashSet<SubtitleDescriptor>();
|
||||
|
||||
// search for and automatically select movie / show entry
|
||||
Set<SearchResult> resultSet = new HashSet<SearchResult>();
|
||||
@ -93,7 +89,6 @@ public final class SubtitleUtilities {
|
||||
return subtitles;
|
||||
}
|
||||
|
||||
|
||||
protected static Collection<SearchResult> findProbableSearchResults(String query, Iterable<? extends SearchResult> searchResults) {
|
||||
// auto-select most probable search result
|
||||
Set<SearchResult> probableMatches = new LinkedHashSet<SearchResult>();
|
||||
@ -111,7 +106,6 @@ public final class SubtitleUtilities {
|
||||
return probableMatches;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Detect charset and parse subtitle file even if extension is invalid
|
||||
*/
|
||||
@ -151,7 +145,6 @@ public final class SubtitleUtilities {
|
||||
throw new IOException("Cannot read subtitle format");
|
||||
}
|
||||
|
||||
|
||||
public static ByteBuffer exportSubtitles(MemoryFile data, SubtitleFormat outputFormat, long outputTimingOffset, Charset outputEncoding) throws IOException {
|
||||
if (outputFormat != null && outputFormat != SubtitleFormat.SubRip) {
|
||||
throw new IllegalArgumentException("Format not supported");
|
||||
@ -177,7 +170,6 @@ public final class SubtitleUtilities {
|
||||
return outputEncoding.encode(getText(data.getData()));
|
||||
}
|
||||
|
||||
|
||||
public static SubtitleFormat getSubtitleFormat(File file) {
|
||||
for (SubtitleFormat it : SubtitleFormat.values()) {
|
||||
if (it.getFilter().accept(file))
|
||||
@ -187,7 +179,6 @@ public final class SubtitleUtilities {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public static SubtitleFormat getSubtitleFormatByName(String name) {
|
||||
for (SubtitleFormat it : SubtitleFormat.values()) {
|
||||
// check by name
|
||||
@ -202,7 +193,6 @@ public final class SubtitleUtilities {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public static String formatSubtitle(String name, String languageName, String type) {
|
||||
StringBuilder sb = new StringBuilder(name);
|
||||
|
||||
@ -224,7 +214,6 @@ public final class SubtitleUtilities {
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
|
||||
public static MemoryFile fetchSubtitle(SubtitleDescriptor descriptor) throws Exception {
|
||||
ByteBuffer data = descriptor.fetch();
|
||||
|
||||
@ -246,7 +235,6 @@ public final class SubtitleUtilities {
|
||||
return new MemoryFile(descriptor.getPath(), data);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Dummy constructor to prevent instantiation.
|
||||
*/
|
||||
|
@ -892,7 +892,7 @@ class SubtitleAutoMatchDialog extends JDialog {
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return String.format("%s (by hash)", service.getName());
|
||||
return String.format("%s [via hash]", service.getName());
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -919,7 +919,7 @@ class SubtitleAutoMatchDialog extends JDialog {
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return String.format("%s (by name)", service.getName());
|
||||
return String.format("%s [via name]", service.getName());
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -946,7 +946,7 @@ class SubtitleAutoMatchDialog extends JDialog {
|
||||
}
|
||||
}
|
||||
|
||||
List<SubtitleDescriptor> subtitles = findSubtitles(service, querySet, languageName);
|
||||
Set<SubtitleDescriptor> subtitles = findSubtitles(service, querySet, languageName);
|
||||
|
||||
// dialog may have been cancelled by now
|
||||
if (Thread.interrupted()) {
|
||||
@ -978,6 +978,7 @@ class SubtitleAutoMatchDialog extends JDialog {
|
||||
SimilarityMetric sanity = EpisodeMetrics.verificationMetric();
|
||||
float minMatchSimilarity = 0.5f;
|
||||
|
||||
// this could be very slow, lets hope at this point there is not much left due to positive hash matches
|
||||
for (File file : files) {
|
||||
// add matching subtitles
|
||||
for (SubtitleDescriptor it : subtitles) {
|
||||
|
Loading…
Reference in New Issue
Block a user