added moviedbBrowse in TheMovieDb

modified buildSearchUrl to handle Movie.browse specific url
added constants in TheMovieDb
made isValidString method private
made apiSite and defaultLanguage private
master
Mohammed Le Doze 15 years ago
parent 56213d09ad
commit a4009be32f

@ -10,13 +10,14 @@
* For any reuse or distribution, you must make clear to others the * For any reuse or distribution, you must make clear to others the
* license terms of this work. * license terms of this work.
*/ */
package com.moviejukebox.themoviedb; package com.moviejukebox.themoviedb;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.logging.ConsoleHandler; import java.util.logging.ConsoleHandler;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@ -43,17 +44,25 @@ import com.moviejukebox.themoviedb.tools.WebBrowser;
public class TheMovieDb { public class TheMovieDb {
private String apiKey; private String apiKey;
private static String apiSite = "http://api.themoviedb.org/2.1/";
private static String defaultLanguage = "en-US";
private static Logger logger; private static Logger logger;
private static LogFormatter tmdbFormatter = new LogFormatter(); private static LogFormatter tmdbFormatter = new LogFormatter();
private static ConsoleHandler tmdbConsoleHandler = new ConsoleHandler(); private static ConsoleHandler tmdbConsoleHandler = new ConsoleHandler();
private static final String apiSite = "http://api.themoviedb.org/2.1/";
private static final String defaultLanguage = "en-US";
private static final String MOVIE_SEARCH = "Movie.search";
private static final String MOVIE_BROWSE = "Movie.browse";
private static final String MOVIE_IMDB_LOOKUP = "Movie.imdbLookup";
private static final String MOVIE_GET_INFO = "Movie.getInfo";
private static final String MOVIE_GET_IMAGES = "Movie.getImages";
private static final String PERSON_GET_VERSION = "Person.getVersion";
private static final String PERSON_GET_INFO = "Person.getInfo";
private static final String PERSON_SEARCH = "Person.search";
public TheMovieDb(String apiKey) { public TheMovieDb(String apiKey) {
setLogger(Logger.getLogger("TheMovieDB")); setLogger(Logger.getLogger("TheMovieDB"));
setApiKey(apiKey); setApiKey(apiKey);
} }
public TheMovieDb(String apiKey, Logger logger) { public TheMovieDb(String apiKey, Logger logger) {
setLogger(logger); setLogger(logger);
setApiKey(apiKey); setApiKey(apiKey);
@ -65,7 +74,7 @@ public class TheMovieDb {
WebBrowser.setProxyUsername(username); WebBrowser.setProxyUsername(username);
WebBrowser.setProxyPassword(password); WebBrowser.setProxyPassword(password);
} }
public void setTimeout(int webTimeoutConnect, int webTimeoutRead) { public void setTimeout(int webTimeoutConnect, int webTimeoutRead) {
WebBrowser.setWebTimeoutConnect(webTimeoutConnect); WebBrowser.setWebTimeoutConnect(webTimeoutConnect);
WebBrowser.setWebTimeoutRead(webTimeoutRead); WebBrowser.setWebTimeoutRead(webTimeoutRead);
@ -103,7 +112,13 @@ public class TheMovieDb {
* @return The search URL * @return The search URL
*/ */
private String buildSearchUrl(String prefix, String searchTerm, String language) { private String buildSearchUrl(String prefix, String searchTerm, String language) {
String searchUrl = apiSite + prefix + "/" + language + "/xml/" + apiKey + "/" + searchTerm; String searchUrl = apiSite + prefix + "/" + language + "/xml/" + apiKey;
if (prefix.equals(MOVIE_BROWSE)) {
searchUrl += "?";
} else {
searchUrl += "/";
}
searchUrl += searchTerm;
logger.finest("Search URL: " + searchUrl); logger.finest("Search URL: " + searchUrl);
return searchUrl; return searchUrl;
} }
@ -118,7 +133,7 @@ public class TheMovieDb {
public List<MovieDB> moviedbSearch(String movieTitle, String language) { public List<MovieDB> moviedbSearch(String movieTitle, String language) {
MovieDB movie = null; MovieDB movie = null;
List<MovieDB> movieList = new ArrayList<MovieDB>(); List<MovieDB> movieList = new ArrayList<MovieDB>();
// If the title is null, then exit // If the title is null, then exit
if (!isValidString(movieTitle)) { if (!isValidString(movieTitle)) {
return movieList; return movieList;
@ -127,13 +142,96 @@ public class TheMovieDb {
Document doc = null; Document doc = null;
try { try {
String searchUrl = buildSearchUrl("Movie.search", URLEncoder.encode(movieTitle, "UTF-8"), language); String searchUrl = buildSearchUrl(MOVIE_SEARCH, URLEncoder.encode(movieTitle, "UTF-8"), language);
doc = DOMHelper.getEventDocFromUrl(searchUrl);
NodeList nlMovies = doc.getElementsByTagName("movie");
if (nlMovies == null) {
return movieList;
}
for (int loop = 0; loop < nlMovies.getLength(); loop++) {
Node nMovie = nlMovies.item(loop);
if (nMovie.getNodeType() == Node.ELEMENT_NODE) {
Element eMovie = (Element) nMovie;
movie = DOMParser.parseMovieInfo(eMovie);
if (movie != null) {
movieList.add(movie);
}
}
}
} catch (Exception error) {
logger.severe("TheMovieDb Error: " + error.getMessage());
}
return movieList;
}
/**
* Browse the database using the default parameters.
* http://api.themoviedb.org/2.1/methods/Movie.browse
*
* @param orderBy either <code>rating</code>,
* <code>release</code> or <code>title</code>
* @param order how results are ordered. Either <code>asc</code> or
* <code>desc</code>
* @param language the two digit language code. E.g. en=English
* @return a list of MovieDB objects
*/
public List<MovieDB> moviedbBrowse(String orderBy, String order, String language) {
return this.moviedbBrowse(orderBy, order, new HashMap<String, String>(), language);
}
/**
* Browse the database using optional parameters.
* http://api.themoviedb.org/2.1/methods/Movie.browse
*
* @param orderBy either <code>rating</code>,
* <code>release</code> or <code>title</code>
* @param order how results are ordered. Either <code>asc</code> or
* <code>desc</code>
* @param parameters a Map of optional parameters. See the complete list
* in the url above.
* @param language the two digit language code. E.g. en=English
* @return a list of MovieDB objects
*/
public List<MovieDB> moviedbBrowse(String orderBy, String order,
Map<String, String> parameters, String language) {
List<String> validParameters = new ArrayList<String>();
validParameters.add("per_page");
validParameters.add("page");
validParameters.add("query");
validParameters.add("min_votes");
validParameters.add("rating_min");
validParameters.add("rating_max");
validParameters.add("genres");
validParameters.add("genres_selector");
validParameters.add("release_min");
validParameters.add("release_max");
validParameters.add("year");
validParameters.add("certifications");
validParameters.add("companies");
validParameters.add("countries");
String url = "order_by=" + orderBy + "&order=" + order;
for (String key : validParameters) {
if (parameters.containsKey(key)) {
url += "&" + key + "=" + parameters.get(key);
}
}
logger.finest("Browse URL : " + url);
MovieDB movie = null;
List<MovieDB> movieList = new ArrayList<MovieDB>();
Document doc = null;
try {
String searchUrl = buildSearchUrl(MOVIE_BROWSE, url, language);
doc = DOMHelper.getEventDocFromUrl(searchUrl); doc = DOMHelper.getEventDocFromUrl(searchUrl);
NodeList nlMovies = doc.getElementsByTagName("movie"); NodeList nlMovies = doc.getElementsByTagName("movie");
if (nlMovies == null) { if (nlMovies == null) {
return movieList; return movieList;
} }
for (int loop = 0; loop < nlMovies.getLength(); loop++) { for (int loop = 0; loop < nlMovies.getLength(); loop++) {
Node nMovie = nlMovies.item(loop); Node nMovie = nlMovies.item(loop);
if (nMovie.getNodeType() == Node.ELEMENT_NODE) { if (nMovie.getNodeType() == Node.ELEMENT_NODE) {
@ -164,11 +262,11 @@ public class TheMovieDb {
if (!isValidString(imdbID)) { if (!isValidString(imdbID)) {
return movie; return movie;
} }
Document doc = null; Document doc = null;
try { try {
String searchUrl = buildSearchUrl("Movie.imdbLookup", imdbID, language); String searchUrl = buildSearchUrl(MOVIE_IMDB_LOOKUP, imdbID, language);
doc = DOMHelper.getEventDocFromUrl(searchUrl); doc = DOMHelper.getEventDocFromUrl(searchUrl);
NodeList nlMovies = doc.getElementsByTagName("movie"); NodeList nlMovies = doc.getElementsByTagName("movie");
@ -215,25 +313,26 @@ public class TheMovieDb {
*/ */
public MovieDB moviedbGetInfo(String tmdbID, MovieDB movie, String language) { public MovieDB moviedbGetInfo(String tmdbID, MovieDB movie, String language) {
// If the tmdbID is invalid, then exit // If the tmdbID is invalid, then exit
if (!isValidString(tmdbID)) if (!isValidString(tmdbID)) {
return movie; return movie;
}
Document doc = null; Document doc = null;
try { try {
String searchUrl = buildSearchUrl("Movie.getInfo", tmdbID, language); String searchUrl = buildSearchUrl(MOVIE_GET_INFO, tmdbID, language);
doc = DOMHelper.getEventDocFromUrl(searchUrl); doc = DOMHelper.getEventDocFromUrl(searchUrl);
if (doc == null && !language.equalsIgnoreCase(defaultLanguage)) { if (doc == null && !language.equalsIgnoreCase(defaultLanguage)) {
logger.fine("Trying to get the default version"); logger.fine("Trying to get the default version");
Thread.dumpStack(); Thread.dumpStack();
searchUrl = buildSearchUrl("Movie.getInfo", tmdbID, defaultLanguage); searchUrl = buildSearchUrl(MOVIE_GET_INFO, tmdbID, defaultLanguage);
} }
if (doc == null) { if (doc == null) {
return movie; return movie;
} }
NodeList nlMovies = doc.getElementsByTagName("movie"); NodeList nlMovies = doc.getElementsByTagName("movie");
if (nlMovies == null) { if (nlMovies == null) {
return movie; return movie;
@ -257,7 +356,7 @@ public class TheMovieDb {
movie = moviedbGetInfo(searchTerm, movie, language); movie = moviedbGetInfo(searchTerm, movie, language);
return movie; return movie;
} }
/** /**
* Get all the image information from TheMovieDb. * Get all the image information from TheMovieDb.
* @param searchTerm Can be either the IMDb ID or TMDb ID * @param searchTerm Can be either the IMDb ID or TMDb ID
@ -267,14 +366,15 @@ public class TheMovieDb {
*/ */
public MovieDB moviedbGetImages(String searchTerm, MovieDB movie, String language) { public MovieDB moviedbGetImages(String searchTerm, MovieDB movie, String language) {
// If the searchTerm is null, then exit // If the searchTerm is null, then exit
if (isValidString(searchTerm)) if (isValidString(searchTerm)) {
return movie; return movie;
}
Document doc = null; Document doc = null;
try { try {
String searchUrl = buildSearchUrl("Movie.getImages", searchTerm, language); String searchUrl = buildSearchUrl(MOVIE_GET_IMAGES, searchTerm, language);
doc = DOMHelper.getEventDocFromUrl(searchUrl); doc = DOMHelper.getEventDocFromUrl(searchUrl);
NodeList nlMovies = doc.getElementsByTagName("movie"); NodeList nlMovies = doc.getElementsByTagName("movie");
if (nlMovies == null) { if (nlMovies == null) {
@ -311,18 +411,18 @@ public class TheMovieDb {
} }
Document doc = null; Document doc = null;
try { try {
String searchUrl = buildSearchUrl("Person.search", personName, language); String searchUrl = buildSearchUrl(PERSON_SEARCH, personName, language);
doc = DOMHelper.getEventDocFromUrl(searchUrl); doc = DOMHelper.getEventDocFromUrl(searchUrl);
person = DOMParser.parsePersonInfo(doc); person = DOMParser.parsePersonInfo(doc);
} catch (Exception error) { } catch (Exception error) {
logger.severe("ERROR: " + error.getMessage()); logger.severe("ERROR: " + error.getMessage());
} }
return person; return person;
} }
/** /**
* The Person.getInfo method is used to retrieve the full filmography, known movies, * The Person.getInfo method is used to retrieve the full filmography, known movies,
* images and things like birthplace for a specific person in the TMDb database. * images and things like birthplace for a specific person in the TMDb database.
@ -336,20 +436,20 @@ public class TheMovieDb {
if (!isValidString(personID)) { if (!isValidString(personID)) {
return person; return person;
} }
Document doc = null; Document doc = null;
try { try {
String searchUrl = buildSearchUrl("Person.getInfo", personID, language); String searchUrl = buildSearchUrl(PERSON_GET_INFO, personID, language);
doc = DOMHelper.getEventDocFromUrl(searchUrl); doc = DOMHelper.getEventDocFromUrl(searchUrl);
person = DOMParser.parsePersonInfo(doc); person = DOMParser.parsePersonInfo(doc);
} catch (Exception error) { } catch (Exception error) {
logger.severe("ERROR: " + error.getMessage()); logger.severe("ERROR: " + error.getMessage());
} }
return person; return person;
} }
/** /**
* The Person.getVersion method is used to retrieve the last modified time along with * The Person.getVersion method is used to retrieve the last modified time along with
* the current version number of the called object(s). This is useful if you've already * the current version number of the called object(s). This is useful if you've already
@ -368,34 +468,34 @@ public class TheMovieDb {
Document doc = null; Document doc = null;
try { try {
String searchUrl = buildSearchUrl("Person.getVersion", personID, language); String searchUrl = buildSearchUrl(PERSON_GET_VERSION, personID, language);
doc = DOMHelper.getEventDocFromUrl(searchUrl); doc = DOMHelper.getEventDocFromUrl(searchUrl);
person = DOMParser.parsePersonGetVersion(doc); person = DOMParser.parsePersonGetVersion(doc);
} catch (Exception error) { } catch (Exception error) {
logger.severe("ERROR: " + error.getMessage()); logger.severe("ERROR: " + error.getMessage());
} }
return person; return person;
} }
/** /**
* Check the string passed to see if it contains a value. * Check the string passed to see if it contains a value.
* @param testString The string to test * @param testString The string to test
* @return False if the string is empty, null or UNKNOWN, True otherwise * @return False if the string is empty, null or UNKNOWN, True otherwise
*/ */
public static boolean isValidString(String testString) { private static boolean isValidString(String testString) {
if (testString == null) { if (testString == null) {
return false; return false;
} }
if (testString.equalsIgnoreCase(MovieDB.UNKNOWN)) { if (testString.equalsIgnoreCase(MovieDB.UNKNOWN)) {
return false; return false;
} }
if (testString.trim().equals("")) { if (testString.trim().equals("")) {
return false; return false;
} }
return true; return true;
} }
@ -410,16 +510,16 @@ public class TheMovieDb {
if (movieList == null || movieList.isEmpty()) { if (movieList == null || movieList.isEmpty()) {
return null; return null;
} }
for (MovieDB moviedb : movieList) { for (MovieDB moviedb : movieList) {
if (compareMovies(moviedb, title, year)) { if (compareMovies(moviedb, title, year)) {
return moviedb; return moviedb;
} }
} }
return null; return null;
} }
/** /**
* Compare the MovieDB object with a title & year * Compare the MovieDB object with a title & year
* @param moviedb The moviedb object to compare too * @param moviedb The moviedb object to compare too
@ -428,6 +528,10 @@ public class TheMovieDb {
* @return True if there is a match, False otherwise. * @return True if there is a match, False otherwise.
*/ */
public static boolean compareMovies(MovieDB moviedb, String title, String year) { public static boolean compareMovies(MovieDB moviedb, String title, String year) {
if (moviedb == null) {
return false;
}
if (!isValidString(title)) { if (!isValidString(title)) {
return false; return false;
} }

Loading…
Cancel
Save