diff --git a/source/ehcache.xml b/source/ehcache.xml index dc021626..5ebea897 100644 --- a/source/ehcache.xml +++ b/source/ehcache.xml @@ -19,7 +19,7 @@ /> + + + diff --git a/source/net/sourceforge/filebot/WebServices.java b/source/net/sourceforge/filebot/WebServices.java index ff175ece..bf351d67 100644 --- a/source/net/sourceforge/filebot/WebServices.java +++ b/source/net/sourceforge/filebot/WebServices.java @@ -49,7 +49,7 @@ public final class WebServices { // episode dbs public static final TVRageClient TVRage = new TVRageClient(); - public static final AnidbClient AniDB = new AnidbClient(getApplicationName().toLowerCase(), 3); + public static final AnidbClient AniDB = new AnidbClientWithLocalSearch(getApplicationName().toLowerCase(), 4); public static final SerienjunkiesClient Serienjunkies = new SerienjunkiesClient(getApplicationProperty("serienjunkies.apikey")); // extended TheTVDB module with local search @@ -202,6 +202,20 @@ public final class WebServices { } + public static class AnidbClientWithLocalSearch extends AnidbClient { + + public AnidbClientWithLocalSearch(String client, int clientver) { + super(client, clientver); + } + + + @Override + public List getAnimeTitles() throws Exception { + return asList(MediaDetection.releaseInfo.getAnidbIndex()); + } + } + + /** * Dummy constructor to prevent instantiation. */ diff --git a/source/net/sourceforge/filebot/media/ReleaseInfo.java b/source/net/sourceforge/filebot/media/ReleaseInfo.java index 346f14fd..ada22cf2 100644 --- a/source/net/sourceforge/filebot/media/ReleaseInfo.java +++ b/source/net/sourceforge/filebot/media/ReleaseInfo.java @@ -35,6 +35,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.zip.GZIPInputStream; +import net.sourceforge.filebot.web.AnidbClient.AnidbSearchResult; import net.sourceforge.filebot.web.CachedResource; import net.sourceforge.filebot.web.Movie; import net.sourceforge.filebot.web.TheTVDBClient.TheTVDBSearchResult; @@ -243,7 +244,12 @@ public class ReleaseInfo { public TheTVDBSearchResult[] getTheTVDBIndex() throws IOException { - return theTVDBIndexResource.get(); + return tvdbIndexResource.get(); + } + + + public AnidbSearchResult[] getAnidbIndex() throws IOException { + return anidbIndexResource.get(); } @@ -275,7 +281,8 @@ public class ReleaseInfo { protected final CachedResource movieListResource = new MovieResource(getBundle(getClass().getName()).getString("url.movie-list")); protected final CachedResource seriesListResource = new SeriesListResource(getBundle(getClass().getName()).getString("url.series-list")); protected final CachedResource seriesDirectMappingsResource = new PatternResource(getBundle(getClass().getName()).getString("url.series-mappings")); - protected final CachedResource theTVDBIndexResource = new TheTVDBIndexResource(getBundle(getClass().getName()).getString("url.thetvdb-index")); + protected final CachedResource tvdbIndexResource = new TheTVDBIndexResource(getBundle(getClass().getName()).getString("url.thetvdb-index")); + protected final CachedResource anidbIndexResource = new AnidbIndexResource(getBundle(getClass().getName()).getString("url.anidb-index")); protected static class PatternResource extends CachedResource { @@ -353,6 +360,35 @@ public class ReleaseInfo { } + protected static class AnidbIndexResource extends CachedResource { + + public AnidbIndexResource(String resource) { + super(resource, AnidbSearchResult[].class, 7 * 24 * 60 * 60 * 1000); // check for updates once a week + } + + + @Override + public AnidbSearchResult[] process(ByteBuffer data) throws IOException { + Scanner scanner = new Scanner(new GZIPInputStream(new ByteBufferInputStream(data)), "UTF-8").useDelimiter("\t|\n"); + + List anime = new ArrayList(); + while (scanner.hasNext() && scanner.hasNextInt()) { + int aid = scanner.nextInt(); + String primaryTitle = scanner.next().trim(); + String englishTitle = scanner.next().trim(); + + if (englishTitle.isEmpty() || englishTitle.equals(primaryTitle)) { + anime.add(new AnidbSearchResult(aid, primaryTitle, null)); + } else { + anime.add(new AnidbSearchResult(aid, primaryTitle, singletonMap("en", englishTitle))); + } + } + + return anime.toArray(new AnidbSearchResult[0]); + } + } + + protected static class FolderEntryFilter implements FileFilter { private final Pattern entryPattern; diff --git a/source/net/sourceforge/filebot/media/ReleaseInfo.properties b/source/net/sourceforge/filebot/media/ReleaseInfo.properties index e50daf54..8e28847d 100644 --- a/source/net/sourceforge/filebot/media/ReleaseInfo.properties +++ b/source/net/sourceforge/filebot/media/ReleaseInfo.properties @@ -5,25 +5,28 @@ pattern.video.source: CAMRip|CAM|PDVD|TS|TELESYNC|PDVD|PPV|PPVRip|Screener|SCR|S pattern.video.format: DivX|Xvid|AVC|x264|h264|3ivx|mpeg|mpeg4|mp3|aac|ac3|dd20|dd51|2ch|6ch|DTS|WS|HR|7p|720p|18p|1080p|NTSC # known release group names -url.release-groups: http://www.filebot.net/data/release-groups.txt +url.release-groups: http://filebot.net/data/release-groups.txt # blacklisted terms that will be ignored -url.query-blacklist: http://www.filebot.net/data/query-blacklist.txt +url.query-blacklist: http://filebot.net/data/query-blacklist.txt # clutter files that will be ignored -url.exclude-blacklist: http://www.filebot.net/data/exclude-blacklist.txt +url.exclude-blacklist: http://filebot.net/data/exclude-blacklist.txt # list of patterns directly matching files to series names -url.series-mappings: http://www.filebot.net/data/series-mappings.txt +url.series-mappings: http://filebot.net/data/series-mappings.txt # list of all movies (id, name, year) -url.movie-list: http://www.filebot.net/data/movies.txt.gz +url.movie-list: http://filebot.net/data/movies.txt.gz # list of tv show and anime names -url.series-list: http://www.filebot.net/data/series.list.gz +url.series-list: http://filebot.net/data/series.list.gz # TheTVDB index -url.thetvdb-index: http://www.filebot.net/data/thetvdb.txt.gz +url.thetvdb-index: http://filebot.net/data/thetvdb.txt.gz + +# AniDB index +url.anidb-index: http://filebot.net/data/anidb.txt.gz # disk folder matcher pattern.diskfolder.entry: BDMV|HVDVD_TS|VIDEO_TS|AUDIO_TS|VCD|movie.nfo diff --git a/source/net/sourceforge/filebot/web/AnidbClient.java b/source/net/sourceforge/filebot/web/AnidbClient.java index 5274f0ba..19b9d6b6 100644 --- a/source/net/sourceforge/filebot/web/AnidbClient.java +++ b/source/net/sourceforge/filebot/web/AnidbClient.java @@ -70,7 +70,7 @@ public class AnidbClient extends AbstractEpisodeListProvider { @Override public ResultCache getCache() { - return new ResultCache(host, Cache.getCache("web-datasource")); + return new ResultCache(host, Cache.getCache("web-datasource-lv2")); } @@ -87,7 +87,7 @@ public class AnidbClient extends AbstractEpisodeListProvider { @Override protected Set getFields(AnidbSearchResult anime) { - return set(anime.getPrimaryTitle(), anime.getOfficialTitle("en"), anime.getOfficialTitle(locale.getLanguage())); + return set(anime.getPrimaryTitle(), anime.getOfficialTitle("en")); } }; @@ -154,7 +154,7 @@ public class AnidbClient extends AbstractEpisodeListProvider { public synchronized List getAnimeTitles() throws Exception { - URL url = new URL("http", host, "/api/animetitles.dat.gz"); + URL url = new URL("http", host, "/api/anime-titles.dat.gz"); ResultCache cache = getCache(); @SuppressWarnings("unchecked") diff --git a/website/data/.htaccess b/website/data/.htaccess index 57aa4bc8..1b68a8df 100644 --- a/website/data/.htaccess +++ b/website/data/.htaccess @@ -3,3 +3,4 @@ options +indexes redirect 301 /data/movies.txt.gz http://sourceforge.net/projects/filebot/files/data/movies.txt.gz/download redirect 301 /data/series.list.gz http://sourceforge.net/projects/filebot/files/data/series.list.gz/download redirect 301 /data/thetvdb.txt.gz http://sourceforge.net/projects/filebot/files/data/thetvdb.txt.gz/download +redirect 301 /data/anidb.txt.gz http://sourceforge.net/projects/filebot/files/data/anidb.txt.gz/download