* separate long-term caches that have different update frequencies

This commit is contained in:
Reinhard Pointner 2013-11-29 04:29:56 +00:00
parent e7668f2c5c
commit 198b8b0e06
5 changed files with 90 additions and 118 deletions

View File

@ -46,12 +46,26 @@
memoryStoreEvictionPolicy="LRU" memoryStoreEvictionPolicy="LRU"
/> />
<!--
Long-lived (2 months) persistent disk cache for web responses (that can be updated via If-Modified or If-None-Match)
-->
<cache name="web-datasource-lv3"
maxElementsInMemory="200"
maxElementsOnDisk="95000"
eternal="false"
timeToIdleSeconds="5256000"
timeToLiveSeconds="5256000"
overflowToDisk="true"
diskPersistent="true"
memoryStoreEvictionPolicy="LRU"
/>
<!-- <!--
Very long-lived cache (4 months) anime/series lists, movie index, etc Very long-lived cache (4 months) anime/series lists, movie index, etc
--> -->
<cache name="web-persistent-datasource" <cache name="web-persistent-datasource"
maxElementsInMemory="200" maxElementsInMemory="50"
maxElementsOnDisk="95000" maxElementsOnDisk="5000"
eternal="false" eternal="false"
timeToIdleSeconds="10512000" timeToIdleSeconds="10512000"
timeToLiveSeconds="10512000" timeToLiveSeconds="10512000"

View File

@ -23,7 +23,7 @@ public class CachedXmlResource extends AbstractCachedResource<String, String> {
@Override @Override
protected Cache getCache() { protected Cache getCache() {
return CacheManager.getInstance().getCache("web-persistent-datasource"); return CacheManager.getInstance().getCache("web-datasource-lv3");
} }
public Document getDocument() throws IOException { public Document getDocument() throws IOException {

View File

@ -45,7 +45,7 @@ public abstract class ETagCachedResource<T extends Serializable> extends CachedR
@Override @Override
protected Cache getCache() { protected Cache getCache() {
return CacheManager.getInstance().getCache("web-persistent-datasource"); return CacheManager.getInstance().getCache("web-datasource-lv3");
} }
} }

View File

@ -1,7 +1,5 @@
package net.sourceforge.filebot.web; package net.sourceforge.filebot.web;
import static net.sourceforge.filebot.web.WebRequest.*; import static net.sourceforge.filebot.web.WebRequest.*;
import static net.sourceforge.tuned.XPathUtilities.*; import static net.sourceforge.tuned.XPathUtilities.*;
@ -25,37 +23,30 @@ import net.sourceforge.filebot.web.FanartTV.FanartDescriptor.FanartProperty;
import org.w3c.dom.Document; import org.w3c.dom.Document;
import org.w3c.dom.Node; import org.w3c.dom.Node;
public class FanartTV { public class FanartTV {
private String apikey; private String apikey;
public FanartTV(String apikey) { public FanartTV(String apikey) {
this.apikey = apikey; this.apikey = apikey;
} }
public List<FanartDescriptor> getSeriesArtwork(int tvdbid) throws Exception { public List<FanartDescriptor> getSeriesArtwork(int tvdbid) throws Exception {
return getSeriesArtwork(String.valueOf(tvdbid), "all", 1, 2); return getSeriesArtwork(String.valueOf(tvdbid), "all", 1, 2);
} }
public List<FanartDescriptor> getSeriesArtwork(String id, String type, int sort, int limit) throws Exception { public List<FanartDescriptor> getSeriesArtwork(String id, String type, int sort, int limit) throws Exception {
return getArtwork("series", id, type, sort, limit); return getArtwork("series", id, type, sort, limit);
} }
public List<FanartDescriptor> getMovieArtwork(int tmdbid) throws Exception { public List<FanartDescriptor> getMovieArtwork(int tmdbid) throws Exception {
return getMovieArtwork(String.valueOf(tmdbid), "all", 1, 2); return getMovieArtwork(String.valueOf(tmdbid), "all", 1, 2);
} }
public List<FanartDescriptor> getMovieArtwork(String id, String type, int sort, int limit) throws Exception { public List<FanartDescriptor> getMovieArtwork(String id, String type, int sort, int limit) throws Exception {
return getArtwork("movie", id, type, sort, limit); return getArtwork("movie", id, type, sort, limit);
} }
public List<FanartDescriptor> getArtwork(String category, String id, String type, int sort, int limit) throws Exception { public List<FanartDescriptor> getArtwork(String category, String id, String type, int sort, int limit) throws Exception {
String resource = getResource(category, id, "xml", type, sort, limit); String resource = getResource(category, id, "xml", type, sort, limit);
@ -83,23 +74,20 @@ public class FanartTV {
return fanart.toArray(new FanartDescriptor[0]); return fanart.toArray(new FanartDescriptor[0]);
} }
@Override @Override
protected Cache getCache() { protected Cache getCache() {
return CacheManager.getInstance().getCache("web-datasource"); return CacheManager.getInstance().getCache("web-datasource-lv2");
} }
}; };
return Arrays.asList(data.get()); return Arrays.asList(data.get());
} }
public String getResource(String category, String id, String format, String type, int sort, int limit) throws MalformedURLException { public String getResource(String category, String id, String format, String type, int sort, int limit) throws MalformedURLException {
// e.g. http://fanart.tv/webservice/series/780b986b22c35e6f7a134a2f392c2deb/70327/xml/all/1/2 // e.g. http://fanart.tv/webservice/series/780b986b22c35e6f7a134a2f392c2deb/70327/xml/all/1/2
return String.format("http://api.fanart.tv/webservice/%s/%s/%s/%s/%s/%s/%s", category, apikey, id, format, type, sort, limit); return String.format("http://api.fanart.tv/webservice/%s/%s/%s/%s/%s/%s/%s", category, apikey, id, format, type, sort, limit);
} }
public static class FanartDescriptor implements Serializable { public static class FanartDescriptor implements Serializable {
public static enum FanartProperty { public static enum FanartProperty {
@ -108,32 +96,26 @@ public class FanartTV {
protected Map<FanartProperty, String> fields; protected Map<FanartProperty, String> fields;
protected FanartDescriptor() { protected FanartDescriptor() {
// used by serializer // used by serializer
} }
protected FanartDescriptor(Map<FanartProperty, String> fields) { protected FanartDescriptor(Map<FanartProperty, String> fields) {
this.fields = new EnumMap<FanartProperty, String>(fields); this.fields = new EnumMap<FanartProperty, String>(fields);
} }
public String get(Object key) { public String get(Object key) {
return fields.get(FanartProperty.valueOf(key.toString())); return fields.get(FanartProperty.valueOf(key.toString()));
} }
public String get(FanartProperty key) { public String get(FanartProperty key) {
return fields.get(key); return fields.get(key);
} }
public String getType() { public String getType() {
return fields.get(FanartProperty.type); return fields.get(FanartProperty.type);
} }
public Integer getId() { public Integer getId() {
try { try {
return new Integer(fields.get(FanartProperty.id)); return new Integer(fields.get(FanartProperty.id));
@ -142,12 +124,10 @@ public class FanartTV {
} }
} }
public String getName() { public String getName() {
return new File(getUrl().getFile()).getName(); return new File(getUrl().getFile()).getName();
} }
public URL getUrl() { public URL getUrl() {
try { try {
return new URL(fields.get(FanartProperty.url).replaceAll(" ", "%20")); // work around server-side url encoding issues return new URL(fields.get(FanartProperty.url).replaceAll(" ", "%20")); // work around server-side url encoding issues
@ -156,7 +136,6 @@ public class FanartTV {
} }
} }
public Integer getLikes() { public Integer getLikes() {
try { try {
return new Integer(fields.get(FanartProperty.likes)); return new Integer(fields.get(FanartProperty.likes));
@ -165,7 +144,6 @@ public class FanartTV {
} }
} }
public Locale getLanguage() { public Locale getLanguage() {
try { try {
return new Locale(fields.get(FanartProperty.lang)); return new Locale(fields.get(FanartProperty.lang));
@ -174,7 +152,6 @@ public class FanartTV {
} }
} }
public Integer getSeason() { public Integer getSeason() {
try { try {
return new Integer(fields.get(FanartProperty.season)); return new Integer(fields.get(FanartProperty.season));
@ -183,12 +160,10 @@ public class FanartTV {
} }
} }
public String getDiskType() { public String getDiskType() {
return fields.get(FanartProperty.disc_type); return fields.get(FanartProperty.disc_type);
} }
@Override @Override
public String toString() { public String toString() {
return fields.toString(); return fields.toString();

View File

@ -1,7 +1,5 @@
package net.sourceforge.filebot.web; package net.sourceforge.filebot.web;
import static net.sourceforge.filebot.web.WebRequest.*; import static net.sourceforge.filebot.web.WebRequest.*;
import static net.sourceforge.tuned.XPathUtilities.*; import static net.sourceforge.tuned.XPathUtilities.*;
@ -38,24 +36,20 @@ import org.w3c.dom.Document;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
public class IMDbClient implements MovieIdentificationService { public class IMDbClient implements MovieIdentificationService {
private String host = "www.imdb.com"; private String host = "www.imdb.com";
@Override @Override
public String getName() { public String getName() {
return "IMDb"; return "IMDb";
} }
@Override @Override
public Icon getIcon() { public Icon getIcon() {
return ResourceManager.getIcon("search.imdb"); return ResourceManager.getIcon("search.imdb");
} }
protected int getImdbId(String link) { protected int getImdbId(String link) {
Matcher matcher = Pattern.compile("tt(\\d{7})").matcher(link); Matcher matcher = Pattern.compile("tt(\\d{7})").matcher(link);
@ -67,7 +61,6 @@ public class IMDbClient implements MovieIdentificationService {
throw new IllegalArgumentException(String.format("Cannot find imdb id: %s", link)); throw new IllegalArgumentException(String.format("Cannot find imdb id: %s", link));
} }
@Override @Override
public List<Movie> searchMovie(String query, Locale locale) throws Exception { public List<Movie> searchMovie(String query, Locale locale) throws Exception {
Document dom = parsePage(new URL("http", host, "/find?s=tt&q=" + encode(query, false))); Document dom = parsePage(new URL("http", host, "/find?s=tt&q=" + encode(query, false)));
@ -107,7 +100,6 @@ public class IMDbClient implements MovieIdentificationService {
return results; return results;
} }
protected Movie scrapeMovie(Document dom, Locale locale) { protected Movie scrapeMovie(Document dom, Locale locale) {
try { try {
int imdbid = getImdbId(selectString("//LINK[@rel='canonical']/@href", dom)); int imdbid = getImdbId(selectString("//LINK[@rel='canonical']/@href", dom));
@ -124,7 +116,6 @@ public class IMDbClient implements MovieIdentificationService {
} }
} }
@Override @Override
public Movie getMovieDescriptor(int imdbid, Locale locale) throws Exception { public Movie getMovieDescriptor(int imdbid, Locale locale) throws Exception {
try { try {
@ -134,7 +125,6 @@ public class IMDbClient implements MovieIdentificationService {
} }
} }
protected Document parsePage(URL url) throws IOException, SAXException { protected Document parsePage(URL url) throws IOException, SAXException {
CachedPage page = new CachedPage(url) { CachedPage page = new CachedPage(url) {
@ -155,28 +145,23 @@ public class IMDbClient implements MovieIdentificationService {
return getHtmlDocument(page.get()); return getHtmlDocument(page.get());
} }
public String scrape(String imdbid, String xpath) throws IOException, SAXException { public String scrape(String imdbid, String xpath) throws IOException, SAXException {
return scrape(getMoviePageLink(getImdbId(imdbid)).toURL(), xpath); // helper for scraping data in user scripts return scrape(getMoviePageLink(getImdbId(imdbid)).toURL(), xpath); // helper for scraping data in user scripts
} }
public String scrape(URL url, String xpath) throws IOException, SAXException { public String scrape(URL url, String xpath) throws IOException, SAXException {
return selectString(xpath, parsePage(url)); // helper for scraping data in user scripts return selectString(xpath, parsePage(url)); // helper for scraping data in user scripts
} }
public URI getMoviePageLink(int imdbId) { public URI getMoviePageLink(int imdbId) {
return URI.create(String.format("http://www.imdb.com/title/tt%07d/", imdbId)); return URI.create(String.format("http://www.imdb.com/title/tt%07d/", imdbId));
} }
@Override @Override
public Map<File, Movie> getMovieDescriptors(Collection<File> movieFiles, Locale locale) throws Exception { public Map<File, Movie> getMovieDescriptors(Collection<File> movieFiles, Locale locale) throws Exception {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
@SuppressWarnings({ "unchecked", "rawtypes" }) @SuppressWarnings({ "unchecked", "rawtypes" })
public Map<String, String> getImdbApiData(Integer i, String t, String y, boolean tomatoes) throws IOException { public Map<String, String> getImdbApiData(Integer i, String t, String y, boolean tomatoes) throws IOException {
// e.g. http://www.imdbapi.com/?i=tt0379786&r=xml&tomatoes=true // e.g. http://www.imdbapi.com/?i=tt0379786&r=xml&tomatoes=true
@ -193,17 +178,15 @@ public class IMDbClient implements MovieIdentificationService {
return attr; return attr;
} }
@Override @Override
protected Cache getCache() { protected Cache getCache() {
return CacheManager.getInstance().getCache("web-datasource"); return CacheManager.getInstance().getCache("web-datasource-lv2");
} }
}; };
return data.get(); return data.get();
} }
public MovieInfo getImdbApiMovieInfo(Movie movie) throws IOException { public MovieInfo getImdbApiMovieInfo(Movie movie) throws IOException {
Map<String, String> data = movie.getImdbId() > 0 ? getImdbApiData(movie.getImdbId(), "", "", false) : getImdbApiData(null, movie.getName(), String.valueOf(movie.getYear()), false); Map<String, String> data = movie.getImdbId() > 0 ? getImdbApiData(movie.getImdbId(), "", "", false) : getImdbApiData(null, movie.getName(), String.valueOf(movie.getYear()), false);