package com.deepnighttwo.resourceresolver.douban.resolver;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.text.MessageFormat;
import java.util.Map;
import org.eclipse.swt.graphics.Image;
import com.deepnighttwo.resourceresolver.douban.Activator;
import com.deepnighttwo.resourceresolver.douban.resolver.utils.DoubanSearchParser;
import com.deepnighttwo.resourceresolver.douban.resolver.utils.XMLSearchUnit;
import com.deepnighttwo.resourceresolver.ui.resolver.IResourceResolver;
import com.deepnighttwo.resourceresolver.ui.resolver.ResourceResolverColumn;
import com.deepnighttwo.resourceresolver.ui.resolver.data.DoubleData;
import com.deepnighttwo.resourceresolver.ui.resolver.data.IResourceDetailsData;
import com.deepnighttwo.resourceresolver.ui.resolver.data.IntegerData;
import com.deepnighttwo.resourceresolver.ui.resolver.data.LinkData;
import com.deepnighttwo.resourceresolver.ui.resolver.data.LongTextData;
import com.deepnighttwo.resourceresolver.ui.resolver.data.TextData;
import com.deepnighttwo.resourceresolver.ui.views.utils.FileNameSeparater;
enum Douban {
Search, DetailLink, Name, CNName, Rating, RaterCount, Details
}
public class ResourceResolverDouban implements IResourceResolver {
private static String API_KEY = "0da7011cc827219828f50356587564c8";
private static String DOUBAN_WEB_SEARCH_URL = "http://movie.douban.com/subject_search?search_text={0}&cat=1002";
private static String DOUBAN_API_SEARCH_URL = "http://api.douban.com/movie/subjects?q={0}&start-index=1&max-results=1&apikey={1}";
private static int CALL_COUNTER = 0;
private static Image DOUBAN_IMAGE = Activator.getImageDescriptor(
"icons/douban.gif").createImage();
@Override
public ResourceResolverColumn[] getResolveColumnNames() {
return new ResourceResolverColumn[] {
new ResourceResolverColumn("Search On Douban", 90, DOUBAN_IMAGE),
new ResourceResolverColumn("View Details from Douban", 90,
DOUBAN_IMAGE),
new ResourceResolverColumn("Name from Douban", 90, DOUBAN_IMAGE),
new ResourceResolverColumn("Chinese Name from Douban", 90,
DOUBAN_IMAGE),
new ResourceResolverColumn("Rating", 90, DOUBAN_IMAGE),
new ResourceResolverColumn("Rater Count", 90, DOUBAN_IMAGE),
new ResourceResolverColumn("Details from Douban", 90,
DOUBAN_IMAGE) };
}
@Override
public IResourceDetailsData[] getResolvedData(File resourcePath) {
CALL_COUNTER += 2;
if (CALL_COUNTER >= 40) {
try {
Thread.sleep(60 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
CALL_COUNTER = 0;
}
IResourceDetailsData[] results = new IResourceDetailsData[7];
String fileName = resourcePath.getName();
fileName = FileNameSeparater.getMovieNameAndYear(fileName)[0];
String contentEncoded = "";
try {
contentEncoded = URLEncoder.encode(fileName, "UTF-8");
} catch (UnsupportedEncodingException e1) {
// should not happen
}
results[0] = new LinkData(MessageFormat.format(DOUBAN_WEB_SEARCH_URL,
contentEncoded));
try {
URL urlSearch = new URL(MessageFormat.format(DOUBAN_API_SEARCH_URL,
contentEncoded, API_KEY));
URLConnection connSearch = urlSearch.openConnection();
DoubanSearchParser parserSearch = new DoubanSearchParser();
Map<XMLSearchUnit, String> linkMap = parserSearch.parseResults(
connSearch.getInputStream(),
DoubanSearchParser.DETAILS_LINK_API_PATH,
DoubanSearchParser.DETAILS_LINK_URL_PATH);
String apiLinkDetails = linkMap
.get(DoubanSearchParser.DETAILS_LINK_API_PATH);
String urlLinkDetails = linkMap
.get(DoubanSearchParser.DETAILS_LINK_URL_PATH);
results[1] = new LinkData(urlLinkDetails);
if (apiLinkDetails == null) {
results[2] = new TextData("No title found!");
} else {
String urlWithAPIKey = MessageFormat.format(apiLinkDetails
+ "?apikey={0}", API_KEY);
log("Processing:\t" + urlWithAPIKey);
URL urlGetDetails = new URL(urlWithAPIKey);
URLConnection connGetDetails = urlGetDetails.openConnection();
DoubanSearchParser parserDetails = new DoubanSearchParser();
Map<XMLSearchUnit, String> detailsMap = parserDetails
.parseResults(
connGetDetails.getInputStream(),
DoubanSearchParser.DETAILS_TITLE_PATH,
DoubanSearchParser.DETAILS_CHINESE_NAME_PATH,
DoubanSearchParser.DETAILS_RATINGE_PATH,
DoubanSearchParser.DETAILS_RATINGE_RATER_COUNT_PATH,
DoubanSearchParser.DETAILS_CONTENT_PATH);
results[2] = new TextData(
detailsMap.get(DoubanSearchParser.DETAILS_TITLE_PATH));
results[3] = new TextData(
detailsMap
.get(DoubanSearchParser.DETAILS_CHINESE_NAME_PATH));
results[4] = new DoubleData(
detailsMap.get(DoubanSearchParser.DETAILS_RATINGE_PATH));
results[5] = new IntegerData(
detailsMap
.get(DoubanSearchParser.DETAILS_RATINGE_RATER_COUNT_PATH));
results[6] = new LongTextData(
detailsMap.get(DoubanSearchParser.DETAILS_CONTENT_PATH));
}
} catch (Exception e) {
e.printStackTrace();
}
for (int i = 0; i < results.length; i++) {
if (results[i] == null) {
if (i == 4) {
results[i] = new DoubleData(-1.0);
}
if (i == 5) {
results[i] = new IntegerData(-1);
} else {
results[i] = new TextData("N/A");
}
}
}
return results;
}
private static void log(String msg) {
System.out.println(msg);
}
}