package org.lodder.subtools.sublibrary.data.tvrage;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.lodder.subtools.sublibrary.Manager;
import org.lodder.subtools.sublibrary.data.tvrage.model.TVRageEpisode;
import org.lodder.subtools.sublibrary.data.tvrage.model.TVRageEpisodeList;
import org.lodder.subtools.sublibrary.data.tvrage.model.TVRageShowInfo;
public class TVRageApi{
private static final String API_EPISODE_INFO = "episodeinfo.php";
private static final String API_EPISODE_LIST = "episode_list.php";
private static final String API_SEARCH = "search.php";
private static final String API_SHOWINFO = "showinfo.php";
private static final String API_SITE = "http://services.tvrage.com/feeds/";
public static final String UNKNOWN = "UNKNOWN";
private final TVRageParser tvrParser;
public TVRageApi(Manager manager){
tvrParser = new TVRageParser(manager);
}
/**
* Search for the show using the show name
*
* @param showName
* @return list of matching shows
*/
public List<TVRageShowInfo> searchShow(String showName) {
if (!isValidString(showName)) {
return new ArrayList<TVRageShowInfo>();
}
String tvrageURL = buildURL(API_SEARCH, showName).toString();
return tvrParser.getSearchShow(tvrageURL);
}
/**
* Get the episode information for all episodes for a show
*
* @param showID
* @return
*/
public TVRageEpisodeList getEpisodeList(String showID) {
if (!isValidString(showID)) {
return new TVRageEpisodeList();
}
String tvrageURL = buildURL(API_EPISODE_LIST, showID).toString();
return tvrParser.getEpisodeList(tvrageURL);
}
/**
* Get the information for a specific episode
*
* @param showID
* @param seasonId
* @param episodeId
* @return
*/
public TVRageEpisode getEpisodeInfo(String showID, String seasonId, String episodeId) {
if (!isValidString(showID) || !isValidString(seasonId) || !isValidString(episodeId)) {
return new TVRageEpisode();
}
StringBuilder tvrageURL = buildURL(API_EPISODE_INFO, showID);
// Append the Season & Episode to the URL
tvrageURL.append("&ep=").append(seasonId);
tvrageURL.append("x").append(episodeId);
return tvrParser.getEpisodeInfo(tvrageURL.toString());
}
private StringBuilder buildURL(String urlParameter, String urlData) {
// apiSite + search.php + ?show=buffy
// apiSite + showinfo.php + ?sid=2930
// apiSite + episode_list.php + ?sid=2930
StringBuilder tvrageURL = new StringBuilder();
tvrageURL.append(API_SITE);
tvrageURL.append(urlParameter);
tvrageURL.append("?");
String encUrlData = urlData;
try {
encUrlData = URLEncoder.encode(urlData, "UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (urlParameter.equalsIgnoreCase(API_SEARCH)) {
tvrageURL.append("show=").append(encUrlData);
} else if (urlParameter.equalsIgnoreCase(API_SHOWINFO)) {
tvrageURL.append("sid=").append(encUrlData);
} else if (urlParameter.equalsIgnoreCase(API_EPISODE_LIST)) {
tvrageURL.append("sid=").append(encUrlData);
} else if (urlParameter.equalsIgnoreCase(API_EPISODE_INFO)) {
tvrageURL.append("sid=").append(encUrlData);
// Note this needs the season & episode appending to the url
} else {
return new StringBuilder(UNKNOWN);
}
return tvrageURL;
}
/**
* Check the string passed to see if it contains a value.
*
* @param testString The string to test
* @return False if the string is empty, null or UNKNOWN, True otherwise
*/
public static boolean isValidString(String testString) {
return StringUtils.isNotBlank(testString) && (!testString.equalsIgnoreCase(TVRageApi.UNKNOWN));
}
}