* optimize subtitle collection

This commit is contained in:
Reinhard Pointner 2014-01-02 14:56:10 +00:00
parent 060229757a
commit 9e4b38ea9a
4 changed files with 72 additions and 78 deletions

View File

@ -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) {

View File

@ -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 (shortCircuit) {
if (similarity >= 1) {
return similarity;
} else if (similarity <= -1) {
return similarity;
}
}
// possible match or perfect negative match

View File

@ -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.
*/

View File

@ -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) {