* some refactoring & polishing

* update nekohtml to 1.9.13
* update jna to 3.2.3
* update ehcache to 1.7.0
* update mediainfo native libs to 0.7.24
* remove 32-bit mediainfo.dynlib for Mac because Java 6 is only available in 64-bit anyway
This commit is contained in:
Reinhard Pointner 2009-11-02 23:25:04 +00:00
parent f61b084769
commit 5c7f90540a
26 changed files with 187 additions and 35 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -137,8 +137,11 @@
--> -->
<cache name="anidb" <cache name="anidb"
maxElementsInMemory="20" maxElementsInMemory="20"
maxElementsOnDisk="120"
eternal="false"
timeToIdleSeconds="2628000" timeToIdleSeconds="2628000"
timeToLiveSeconds="2628000" timeToLiveSeconds="2628000"
overflowToDisk="true"
diskPersistent="true" diskPersistent="true"
memoryStoreEvictionPolicy="LRU" memoryStoreEvictionPolicy="LRU"
/> />
@ -152,7 +155,7 @@
eternal="false" eternal="false"
timeToIdleSeconds="7200" timeToIdleSeconds="7200"
timeToLiveSeconds="7200" timeToLiveSeconds="7200"
overflowToDisk="false" overflowToDisk="false"
diskPersistent="false" diskPersistent="false"
memoryStoreEvictionPolicy="LRU" memoryStoreEvictionPolicy="LRU"
/> />
@ -162,7 +165,7 @@
Short-lived memory cache for resources like icons. This cache is used by ResourceManager. Short-lived memory cache for resources like icons. This cache is used by ResourceManager.
--> -->
<cache name="resource" <cache name="resource"
maxElementsInMemory="100" maxElementsInMemory="40"
eternal="false" eternal="false"
timeToIdleSeconds="120" timeToIdleSeconds="120"
timeToLiveSeconds="120" timeToLiveSeconds="120"

View File

@ -1,6 +1,7 @@
# application settings # application settings
application.name: FileBot application.name: FileBot
application.version: 0.0 application.version: 1.94
thetvdb.apikey: 58B4AA94C59AD656 thetvdb.apikey: 58B4AA94C59AD656
themoviedb.apikey: 66308fb6e3fd850dde4c7d21df2e8306
sublight.apikey: afa9ecb2-a3ee-42b1-9225-000b4038bc85 sublight.apikey: afa9ecb2-a3ee-42b1-9225-000b4038bc85

View File

@ -55,23 +55,23 @@ String.metaClass.lowerTrail = { replaceAll(/\b(\p{Alpha})(\p{Alpha}+)\b/, { matc
/** /**
* Return substring before the given delimiter. * Return substring before the given pattern.
*/ */
String.metaClass.before = { String.metaClass.before = {
def matcher = delegate =~ it def matcher = delegate =~ it
// delimiter was found, return leading substring, else return original value // pattern was found, return leading substring, else return original value
return matcher.find() ? delegate.substring(0, matcher.start()) : delegate return matcher.find() ? delegate.substring(0, matcher.start()) : delegate
} }
/** /**
* Return substring after the given delimiter. * Return substring after the given pattern.
*/ */
String.metaClass.after = { String.metaClass.after = {
def matcher = delegate =~ it def matcher = delegate =~ it
// delimiter was found, return trailing substring, else return original value // pattern was found, return trailing substring, else return original value
return matcher.find() ? delegate.substring(matcher.end(), delegate.length()) : delegate return matcher.find() ? delegate.substring(matcher.end(), delegate.length()) : delegate
} }
@ -85,7 +85,7 @@ String.metaClass.replaceTrailingBraces = { replacement = "" -> replaceAll(/\s*[(
/** /**
* Replace 'part section'. * Replace 'part identifier'.
* *
* e.g. "Today Is the Day: Part 1" -> "Today Is the Day, Part 1" * e.g. "Today Is the Day: Part 1" -> "Today Is the Day, Part 1"
* "Today Is the Day (1)" -> "Today Is the Day, Part 1" * "Today Is the Day (1)" -> "Today Is the Day, Part 1"

View File

@ -144,7 +144,7 @@ abstract class SubtitleDropTarget extends JButton {
throw new UnsupportedOperationException("Not implemented yet"); throw new UnsupportedOperationException("Not implemented yet");
} }
if (filter(files, VIDEO_FILES).size() == filter(files, SUBTITLE_FILES).size()) { if (containsOnlyVideoSubtitleMatches(files)) {
// TODO implement upload // TODO implement upload
throw new UnsupportedOperationException("Not implemented yet"); throw new UnsupportedOperationException("Not implemented yet");
} }

View File

@ -74,9 +74,12 @@ public class AnidbClient implements EpisodeListProvider {
for (AnidbSearchResult anime : getAnimeTitles()) { for (AnidbSearchResult anime : getAnimeTitles()) {
for (String name : new String[] { anime.getMainTitle(), anime.getEnglishTitle() }) { for (String name : new String[] { anime.getMainTitle(), anime.getEnglishTitle() }) {
if (name != null) { if (name != null) {
float similarity = metric.getSimilarity(name.toLowerCase(), query); // normalize
name = name.toLowerCase();
if (similarity > 0.5 || name.toLowerCase().contains(query)) { float similarity = metric.getSimilarity(name, query);
if (similarity > 0.5 || name.contains(query)) {
resultSet.add(new SimpleEntry<SearchResult, Float>(anime, similarity)); resultSet.add(new SimpleEntry<SearchResult, Float>(anime, similarity));
// add only once // add only once

View File

@ -8,6 +8,7 @@ import java.net.URI;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
@ -61,25 +62,26 @@ public class OpenSubtitlesClient implements SubtitleProvider, VideoHashSubtitleS
// require login // require login
login(); login();
@SuppressWarnings("unchecked") // search for movies / series
List<SearchResult> results = (List) xmlrpc.searchMoviesOnIMDB(query); SearchResult[] result = xmlrpc.searchMoviesOnIMDB(query).toArray(new SearchResult[0]);
return results; return Arrays.asList(result);
} }
@Override @Override
public List<SubtitleDescriptor> getSubtitleList(SearchResult searchResult, String languageName) throws Exception { public List<SubtitleDescriptor> getSubtitleList(SearchResult searchResult, String languageName) throws Exception {
// singleton array with or empty array // singleton array with or empty array
int imdbid = ((MovieDescriptor) searchResult).getImdbId();
String[] languageFilter = languageName != null ? new String[] { getSubLanguageID(languageName) } : new String[0]; String[] languageFilter = languageName != null ? new String[] { getSubLanguageID(languageName) } : new String[0];
// require login // require login
login(); login();
@SuppressWarnings("unchecked") // get subtitle list
List<SubtitleDescriptor> subtitles = (List) xmlrpc.searchSubtitles(((MovieDescriptor) searchResult).getImdbId(), languageFilter); SubtitleDescriptor[] subtitles = xmlrpc.searchSubtitles(imdbid, languageFilter).toArray(new SubtitleDescriptor[0]);
return subtitles; return Arrays.asList(subtitles);
} }

View File

@ -0,0 +1,86 @@
package net.sourceforge.filebot.web;
import static net.sourceforge.filebot.web.WebRequest.*;
import static net.sourceforge.tuned.XPathUtilities.*;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;
public class TMDbClient implements MovieIdentificationService {
private static final String host = "api.themoviedb.org";
private static final String version = "2.1";
private final String apikey;
public TMDbClient(String apikey) {
this.apikey = apikey;
}
public List<MovieDescriptor> searchMovie(String query) throws IOException, SAXException {
return getMovies("Movie.search", query);
}
public List<MovieDescriptor> searchMovie(File file) throws IOException, SAXException {
return getMovies("Hash.getInfo", OpenSubtitlesHasher.computeHash(file));
}
@Override
public MovieDescriptor[] getMovieDescriptors(File[] movieFiles) throws Exception {
MovieDescriptor[] movies = new MovieDescriptor[movieFiles.length];
for (int i = 0; i < movies.length; i++) {
List<MovieDescriptor> options = searchMovie(movieFiles[i]);
// just use first result, if possible
movies[i] = options.isEmpty() ? null : options.get(0);
}
return movies;
}
protected List<MovieDescriptor> getMovies(String method, String parameter) throws IOException, SAXException {
List<MovieDescriptor> result = new ArrayList<MovieDescriptor>();
for (Node node : selectNodes("//movie", getDocument(getResource(method, parameter)))) {
try {
String name = getTextContent("name", node);
// release date format will be YYYY-MM-DD, but we only care about the year
int year = new Scanner(getTextContent("released", node)).useDelimiter("\\D+").nextInt();
// imdb id will be tt1234567, but we only care about the number
int imdbid = new Scanner(getTextContent("imdb_id", node)).useDelimiter("\\D+").nextInt();
result.add(new MovieDescriptor(name, year, imdbid));
} catch (RuntimeException e) {
// release date or imdb id are undefined
}
}
return result;
}
protected URL getResource(String method, String parameter) throws MalformedURLException {
// e.g. http://api.themoviedb.org/2.1/Movie.search/en/xml/{apikey}/serenity
return new URL("http", host, "/" + version + "/" + method + "/en/xml/" + apikey + "/" + parameter);
}
}

View File

@ -13,11 +13,11 @@ import java.util.UUID;
public final class TemporaryFolder { public final class TemporaryFolder {
private static final String tmpdir = System.getProperty("java.io.tmpdir"); private static final File tmpdir = new File(System.getProperty("java.io.tmpdir"));
private static final Map<String, TemporaryFolder> folders = new HashMap<String, TemporaryFolder>(); private static final Map<String, TemporaryFolder> folders = new HashMap<String, TemporaryFolder>();
/** /**
* Get a {@link TemporaryFolder} instance for a given name. The actual directory will be * Get a {@link TemporaryFolder} instance for a given name. The actual directory will be
* created lazily (e.g. when a file is created). The name of the directory will start with * created lazily (e.g. when a file is created). The name of the directory will start with
@ -43,6 +43,7 @@ public final class TemporaryFolder {
} }
} }
/** /**
* Delete all temporary folders on shutdown * Delete all temporary folders on shutdown
*/ */
@ -62,7 +63,7 @@ public final class TemporaryFolder {
private final File root; private final File root;
private TemporaryFolder(File root) { private TemporaryFolder(File root) {
this.root = root; this.root = root;
} }

View File

@ -26,7 +26,7 @@ public class ActionPopup extends JPopupMenu {
protected final JPanel actionPanel = new JPanel(new MigLayout("nogrid, insets 0, fill")); protected final JPanel actionPanel = new JPanel(new MigLayout("nogrid, insets 0, fill"));
public ActionPopup(String label, Icon icon) { public ActionPopup(String label, Icon icon) {
headerLabel.setText(label); headerLabel.setText(label);
headerLabel.setIcon(icon); headerLabel.setIcon(icon);
@ -53,7 +53,7 @@ public class ActionPopup extends JPopupMenu {
public void addAction(JComponent component) { public void addAction(JComponent component) {
actionPanel.add(component, "gapx 12px 12px, wrap"); actionPanel.add(component, "gapx 12px 12px, growx, wrap");
} }
@ -109,6 +109,7 @@ public class ActionPopup extends JPopupMenu {
return statusLabel.getText(); return statusLabel.getText();
} }
private final ActionListener closeListener = new ActionListener() { private final ActionListener closeListener = new ActionListener() {
@Override @Override

View File

@ -25,7 +25,7 @@ public class LinkButton extends JButton {
private Color color = getForeground(); private Color color = getForeground();
private Color rolloverColor = SystemColor.textHighlight; private Color rolloverColor = SystemColor.textHighlight;
public LinkButton(String text, Icon icon, URI uri) { public LinkButton(String text, Icon icon, URI uri) {
this(new OpenUriAction(text, icon, uri)); this(new OpenUriAction(text, icon, uri));
} }
@ -39,6 +39,7 @@ public class LinkButton extends JButton {
setContentAreaFilled(false); setContentAreaFilled(false);
setBorder(null); setBorder(null);
setHorizontalAlignment(LEFT);
setIconTextGap(6); setIconTextGap(6);
setRolloverEnabled(true); setRolloverEnabled(true);
@ -80,6 +81,7 @@ public class LinkButton extends JButton {
this.rolloverColor = rolloverColor; this.rolloverColor = rolloverColor;
} }
protected final MouseListener rolloverListener = new MouseAdapter() { protected final MouseListener rolloverListener = new MouseAdapter() {
@Override @Override
@ -94,12 +96,12 @@ public class LinkButton extends JButton {
} }
}; };
protected static class OpenUriAction extends AbstractAction { protected static class OpenUriAction extends AbstractAction {
public static final String URI = "uri"; public static final String URI = "uri";
public OpenUriAction(String text, Icon icon, URI uri) { public OpenUriAction(String text, Icon icon, URI uri) {
super(text, icon); super(text, icon);
putValue(URI, uri); putValue(URI, uri);

View File

@ -6,9 +6,11 @@ import static org.junit.Assert.*;
import java.util.List; import java.util.List;
import org.junit.AfterClass;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import org.junit.Test; import org.junit.Test;
import net.sf.ehcache.CacheManager;
import net.sourceforge.filebot.web.AnidbClient.AnidbSearchResult; import net.sourceforge.filebot.web.AnidbClient.AnidbSearchResult;
@ -118,4 +120,11 @@ public class AnidbClientTest {
assertEquals("http://anidb.net/a1539", anidb.getEpisodeListLink(monsterSearchResult).toURL().toString()); assertEquals("http://anidb.net/a1539", anidb.getEpisodeListLink(monsterSearchResult).toURL().toString());
} }
@BeforeClass
@AfterClass
public static void clearCache() {
CacheManager.getInstance().clearAll();
}
} }

View File

@ -3,6 +3,7 @@ package net.sourceforge.filebot.web;
import static java.util.Collections.*; import static java.util.Collections.*;
import static net.sourceforge.filebot.Settings.*;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
@ -21,7 +22,7 @@ import net.sourceforge.filebot.web.OpenSubtitlesXmlRpc.TryUploadResponse;
public class OpenSubtitlesXmlRpcTest { public class OpenSubtitlesXmlRpcTest {
private static OpenSubtitlesXmlRpc xmlrpc = new OpenSubtitlesXmlRpc("FileBot 0.0"); private static OpenSubtitlesXmlRpc xmlrpc = new OpenSubtitlesXmlRpc(String.format("%s %s", getApplicationName(), getApplicationVersion()));
@BeforeClass @BeforeClass

View File

@ -2,6 +2,7 @@
package net.sourceforge.filebot.web; package net.sourceforge.filebot.web;
import static net.sourceforge.filebot.Settings.*;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
@ -18,7 +19,7 @@ import net.sublight.webservice.Subtitle;
public class SublightSubtitleClientTest { public class SublightSubtitleClientTest {
private static SublightSubtitleClient client = new SublightSubtitleClient("FileBot", "afa9ecb2-a3ee-42b1-9225-000b4038bc85"); private static SublightSubtitleClient client = new SublightSubtitleClient(getApplicationName(), getApplicationProperty("sublight.apikey"));
@BeforeClass @BeforeClass

View File

@ -0,0 +1,39 @@
package net.sourceforge.filebot.web;
import static net.sourceforge.filebot.Settings.*;
import static org.junit.Assert.*;
import java.util.List;
import org.junit.Test;
public class TMDbClientTest {
private final TMDbClient tmdb = new TMDbClient(getApplicationProperty("themoviedb.apikey"));
@Test
public void searchByName() throws Exception {
List<MovieDescriptor> result = tmdb.searchMovie("transformers");
MovieDescriptor movie = result.get(0);
assertEquals("Transformers", movie.getName());
assertEquals(2007, movie.getYear());
assertEquals(418279, movie.getImdbId());
}
@Test
public void searchByHash() throws Exception {
List<MovieDescriptor> results = tmdb.getMovies("Hash.getInfo", "d7aa0275cace4410");
MovieDescriptor movie = results.get(0);
assertEquals("Iron Man", movie.getName());
assertEquals(2008, movie.getYear());
assertEquals(371746, movie.getImdbId());
}
}

View File

@ -8,7 +8,8 @@ import java.util.EnumSet;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import org.junit.After; import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test; import org.junit.Test;
import net.sf.ehcache.CacheManager; import net.sf.ehcache.CacheManager;
@ -21,12 +22,6 @@ public class TheTVDBClientTest {
private TheTVDBClient thetvdb = new TheTVDBClient("BA864DEE427E384A"); private TheTVDBClient thetvdb = new TheTVDBClient("BA864DEE427E384A");
@After
public void clearCache() {
CacheManager.getInstance().clearAll();
}
@Test @Test
public void search() throws Exception { public void search() throws Exception {
// test default language and query escaping (blanks) // test default language and query escaping (blanks)
@ -122,4 +117,11 @@ public class TheTVDBClientTest {
assertEquals(EnumSet.allOf(MirrorType.class), MirrorType.fromTypeMask(7)); assertEquals(EnumSet.allOf(MirrorType.class), MirrorType.fromTypeMask(7));
} }
@BeforeClass
@AfterClass
public static void clearCache() {
CacheManager.getInstance().clearAll();
}
} }

View File

@ -8,7 +8,8 @@ import org.junit.runners.Suite.SuiteClasses;
@RunWith(Suite.class) @RunWith(Suite.class)
@SuiteClasses( { TVDotComClientTest.class, AnidbClientTest.class, TVRageClientTest.class, TheTVDBClientTest.class, IMDbClientTest.class, SubsceneSubtitleClientTest.class, SubtitleSourceClientTest.class, SublightSubtitleClientTest.class, OpenSubtitlesXmlRpcTest.class }) @SuiteClasses( { TVDotComClientTest.class, AnidbClientTest.class, TVRageClientTest.class, TheTVDBClientTest.class, TMDbClientTest.class, IMDbClientTest.class, SubsceneSubtitleClientTest.class, SubtitleSourceClientTest.class,
SublightSubtitleClientTest.class, OpenSubtitlesXmlRpcTest.class })
public class WebTestSuite { public class WebTestSuite {
} }