* adapt AnidbClient search query string to hide synonyms

* fixed bug that allowed the user to select a season-specific episodelist (e.g. Season 1) from anidb which is not supported
* continue matching process even if we can't fetch episode-lists for one or more auto-detected names
This commit is contained in:
Reinhard Pointner 2009-05-24 13:25:49 +00:00
parent fe37b816d1
commit 3162b3e7bc
9 changed files with 54 additions and 27 deletions

View File

@ -52,16 +52,16 @@ public class MediaTypes {
} }
public FileFilter filter(String path) { public FileFilter filter(String name) {
return new ExtensionFileFilter(extensions(path)); return new ExtensionFileFilter(extensions(name));
} }
public String[] extensions(String path) { public String[] extensions(String name) {
List<String> extensions = new ArrayList<String>(); List<String> extensions = new ArrayList<String>();
for (Type type : types) { for (Type type : types) {
if (type.name.startsWith(path)) { if (type.name.startsWith(name)) {
addAll(extensions, type.extensions); addAll(extensions, type.extensions);
} }
} }

View File

@ -20,7 +20,7 @@ public class Matcher<V, C> {
private final List<V> values; private final List<V> values;
private final List<C> candidates; private final List<C> candidates;
private final List<SimilarityMetric> metrics; private final SimilarityMetric[] metrics;
private final DisjointMatchCollection<V, C> disjointMatchCollection; private final DisjointMatchCollection<V, C> disjointMatchCollection;
@ -29,7 +29,7 @@ public class Matcher<V, C> {
this.values = new LinkedList<V>(values); this.values = new LinkedList<V>(values);
this.candidates = new LinkedList<C>(candidates); this.candidates = new LinkedList<C>(candidates);
this.metrics = new ArrayList<SimilarityMetric>(metrics); this.metrics = metrics.toArray(new SimilarityMetric[0]);
this.disjointMatchCollection = new DisjointMatchCollection<V, C>(); this.disjointMatchCollection = new DisjointMatchCollection<V, C>();
} }
@ -85,13 +85,13 @@ public class Matcher<V, C> {
protected void deepMatch(Collection<Match<V, C>> possibleMatches, int level) throws InterruptedException { protected void deepMatch(Collection<Match<V, C>> possibleMatches, int level) throws InterruptedException {
if (level >= metrics.size() || possibleMatches.isEmpty()) { if (level >= metrics.length || possibleMatches.isEmpty()) {
// no further refinement possible // no further refinement possible
disjointMatchCollection.addAll(possibleMatches); disjointMatchCollection.addAll(possibleMatches);
return; return;
} }
for (List<Match<V, C>> matchesWithEqualSimilarity : mapBySimilarity(possibleMatches, metrics.get(level)).values()) { for (List<Match<V, C>> matchesWithEqualSimilarity : mapBySimilarity(possibleMatches, metrics[level]).values()) {
// some matches may already be unique // some matches may already be unique
List<Match<V, C>> disjointMatches = disjointMatches(matchesWithEqualSimilarity); List<Match<V, C>> disjointMatches = disjointMatches(matchesWithEqualSimilarity);

View File

@ -24,13 +24,25 @@ class SeasonSpinnerModel extends SpinnerNumberModel {
} }
@Override
public Integer getMinimum() {
return (Integer) super.getMinimum();
}
@Override
public Integer getMaximum() {
return (Integer) super.getMaximum();
}
public void spin(int steps) { public void spin(int steps) {
int next = getSeason() + steps; int next = getSeason() + steps;
if (next < ALL_SEASONS) if (next < getMinimum())
next = ALL_SEASONS; next = getMinimum();
else if (next > MAX_VALUE) else if (next > getMaximum())
next = MAX_VALUE; next = getMaximum();
setValue(next); setValue(next);
} }

View File

@ -37,10 +37,10 @@ class AutoFetchEpisodeListMatcher extends SwingWorker<List<Match<File, Episode>>
private final EpisodeListProvider provider; private final EpisodeListProvider provider;
private final Collection<SimilarityMetric> metrics; private final List<SimilarityMetric> metrics;
public AutoFetchEpisodeListMatcher(EpisodeListProvider provider, List<File> files, Collection<SimilarityMetric> metrics) { public AutoFetchEpisodeListMatcher(EpisodeListProvider provider, Collection<File> files, Collection<SimilarityMetric> metrics) {
this.provider = provider; this.provider = provider;
this.files = new LinkedList<File>(files); this.files = new LinkedList<File>(files);
this.metrics = new ArrayList<SimilarityMetric>(metrics); this.metrics = new ArrayList<SimilarityMetric>(metrics);
@ -80,15 +80,14 @@ class AutoFetchEpisodeListMatcher extends SwingWorker<List<Match<File, Episode>>
public Collection<Episode> call() throws Exception { public Collection<Episode> call() throws Exception {
List<SearchResult> results = provider.search(seriesName); List<SearchResult> results = provider.search(seriesName);
if (results.isEmpty()) { // select search result
throw new RuntimeException(String.format("'%s' has not been found.", seriesName)); if (results.size() > 0) {
}
SearchResult selectedSearchResult = selectSearchResult(seriesName, results); SearchResult selectedSearchResult = selectSearchResult(seriesName, results);
if (selectedSearchResult != null) { if (selectedSearchResult != null) {
return provider.getEpisodeList(selectedSearchResult); return provider.getEpisodeList(selectedSearchResult);
} }
}
return Collections.emptyList(); return Collections.emptyList();
} }

View File

@ -97,7 +97,7 @@ class RenameListCellRenderer extends DefaultFancyListCellRenderer {
String extension = FileUtilities.getExtension(file); String extension = FileUtilities.getExtension(file);
if (extension != null) if (extension != null)
return extension; return extension.toLowerCase();
// some file with no extension // some file with no extension
return "File"; return "File";

View File

@ -96,7 +96,7 @@ public class RenameModel extends MatchModel<Object, File> {
String extension = FileUtilities.getExtension(originalFile); String extension = FileUtilities.getExtension(originalFile);
if (extension != null) { if (extension != null) {
newName.append(".").append(extension); newName.append(".").append(extension.toLowerCase());
} }
} }

View File

@ -139,7 +139,7 @@ public class RenamePanel extends JComponent {
add(matchButton, "split 2, flowy, sizegroupx button"); add(matchButton, "split 2, flowy, sizegroupx button");
add(renameButton, "gapy 30px, sizegroupx button"); add(renameButton, "gapy 30px, sizegroupx button");
add(new LoadingOverlayPane(namesList, namesList, "28px", "30px"), "grow, sizegroupx list"); add(new LoadingOverlayPane(namesList, namesList, "32px", "30px"), "grow, sizegroupx list");
} }

View File

@ -44,8 +44,7 @@ public class AnidbClient implements EpisodeListProvider {
@Override @Override
public List<SearchResult> search(String query) throws IOException, SAXException { public List<SearchResult> search(String query) throws IOException, SAXException {
// type=2 -> only TV Series URL searchUrl = new URL("http", host, "/perl-bin/animedb.pl?type.tvspecial=1&type.tvseries=1&type.ova=1&show=animelist&orderby.name=0.1&noalias=1&do.update=update&adb.search=" + URLEncoder.encode(query, "UTF-8"));
URL searchUrl = new URL("http", host, "/perl-bin/animedb.pl?type=2&show=animelist&orderby.name=0.1&orderbar=0&noalias=1&do.search=Search&adb.search=" + URLEncoder.encode(query, "UTF-8"));
Document dom = getHtmlDocument(searchUrl); Document dom = getHtmlDocument(searchUrl);

View File

@ -44,6 +44,23 @@ public class AnidbClientTest {
} }
@Test
public void searchHideSynonyms() throws Exception {
final List<SearchResult> results = anidb.search("one piece");
int count = 0;
for (SearchResult result : results) {
if ("one piece".equalsIgnoreCase(result.getName())) {
count++;
}
}
// must only occur once
assertEquals(1, count, 0);
}
@Test @Test
public void searchResultPageRedirect() throws Exception { public void searchResultPageRedirect() throws Exception {
List<SearchResult> results = anidb.search("twelve kingdoms"); List<SearchResult> results = anidb.search("twelve kingdoms");