@ -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
* /
* /
p ublic static boolean isValidString ( String testString ) {
p rivate 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 ;
}
}