package com.flicklib.service.movie.tmdb;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.flicklib.api.AbstractMovieInfoFetcher;
import com.flicklib.domain.MoviePage;
import com.flicklib.domain.MovieSearchResult;
import com.flicklib.domain.MovieService;
import com.flicklib.service.SourceLoader;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.inject.Inject;
public class TmdbMovieInfoFetcher extends AbstractMovieInfoFetcher {
public static final MovieService TMDB = new MovieService("TMDB", "TheMovieDB", "http://www.themoviedb.org/");
private static final Logger LOGGER = LoggerFactory.getLogger(TmdbMovieInfoFetcher.class);
private static final String LANG_EN = "en";
private static final String TYPE_JSON = "json";
//private static final String TYPE_YAML = "yaml";
//private static final String TYPE_XML = "xml";
private static final String BASE = "http://api.themoviedb.org/2.1";
private final String apiKey;
private final SourceLoader loader;
private final Gson gson;
@Inject
public TmdbMovieInfoFetcher(final SourceLoader loader, final String apiKey) {
this.apiKey = apiKey;
this.loader = loader;
this.gson = new GsonBuilder().setPrettyPrinting().create();
}
@Override
public List<? extends MovieSearchResult> search(String title) throws IOException {
return search(title, (String)null);
}
@Override
public List<? extends MovieSearchResult> search(String title, String year) throws IOException {
TmdbMovie[] tmdbMovies = search(title, Integer.valueOf(year));
List<MoviePage> moviePages = new ArrayList<MoviePage>();
for(TmdbMovie tmdbMovie:tmdbMovies){
MoviePage moviePage = toMoviePage(tmdbMovie);
moviePages.add(moviePage);
}
return moviePages;
}
@Override
public MoviePage getMovieInfo(String idForSite) throws IOException {
// http://api.themoviedb.org/2.1/Movie.getInfo/en/xml/APIKEY/187
String url = BASE + "/Movie.getInfo/" + LANG_EN + "/" + TYPE_JSON + "/" + apiKey + "/" + idForSite;
String result = loader.url(url)
.setHeader("Accept","application/json").get().getString();
JsonParser parser = new JsonParser();
JsonElement element = parser.parse(result).getAsJsonArray().get(0);
TmdbMovie tmdbMovie = gson.fromJson(element, TmdbMovie.class);
return toMoviePage(tmdbMovie);
}
@Override
public MovieService getService() {
return TMDB;
}
private TmdbMovie[] search(final String title, final Integer year) throws IOException{
String search = title;
if(year != null){
search = search + " " + year;
}
String encodedSearch = urlEncodeUtf8(search);
// remove question mark ast this doesn't work
encodedSearch = encodedSearch.replace("%3F", "");
String url = BASE + "/Movie.search/" + LANG_EN + "/" + TYPE_JSON + "/" + apiKey + "/" + encodedSearch;
String result = loader.url(url)
.setHeader("Accept","application/json").get().getString();
JsonParser parser = new JsonParser();
JsonElement element = parser.parse(result);
if(element.isJsonArray() && element.getAsJsonArray().get(0).isJsonPrimitive()){
String message = element.getAsJsonArray().get(0).getAsString();
LOGGER.warn("%s returns %s", url, message);
return new TmdbMovie[0];
}
//System.out.println(gson.toJson(element));
return gson.fromJson(element, TmdbMovie[].class);
}
private MoviePage toMoviePage(TmdbMovie tmdbMovie) {
MoviePage moviePage = new MoviePage();
moviePage.setTitle(tmdbMovie.name);
moviePage.setIdForSite(String.valueOf(tmdbMovie.id));
moviePage.setScore((int) Math.round(Double.parseDouble(tmdbMovie.rating) * 10));
return moviePage;
}
private String urlEncodeUtf8(final String string) {
try {
return URLEncoder.encode(string, "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
}