package com.flicklib.service.movie.imdb; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.Collections; 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.Source; import com.flicklib.service.SourceLoader; import com.google.gson.Gson; import com.google.gson.JsonParseException; public class ImdbApiFetcher extends AbstractMovieInfoFetcher { final static Logger LOG = LoggerFactory.getLogger(ImdbApiFetcher.class); final static MovieService IMDB_API = new MovieService("IMDB_API", "IMDB Api", "http://www.imdbapi.com"); private final SourceLoader loader; private final Gson gson; public ImdbApiFetcher(SourceLoader loader) { this.loader = loader; this.gson = new Gson(); } @Override public List<? extends MovieSearchResult> search(String title) throws IOException { Source source = loader.loadSource(generateSearchUrl(title)); // it seems that it's returns the first result, only ... return Collections.singletonList(parseJson(source)); } @Override public MoviePage getMovieInfo(String idForSite) throws IOException { Source source = loader.loadSource(generateUrl(idForSite)); return parseJson(source); } private MoviePage parseJson(Source source) throws IOException { LOG.info("response from " + source.getUrl() + " type is :" + source.getContentType()); try { ImdbApiMovie imdbApiMovie = gson.fromJson(source.getContent(), ImdbApiMovie.class); return parseInfo(imdbApiMovie); } catch (JsonParseException e) { throw new IOException(e); } } private MoviePage parseInfo(ImdbApiMovie imdbApiMovie) { MoviePage mp = new MoviePage(IMDB_API); mp.setIdForSite(imdbApiMovie.id); mp.setTitle(imdbApiMovie.title); mp.setYear(imdbApiMovie.year); mp.setPlot(imdbApiMovie.plot); mp.setVotes(imdbApiMovie.votes); mp.setImgUrl(imdbApiMovie.poster); mp.setScore((int) Math.round(Double.parseDouble(imdbApiMovie.rating) * 10)); // for (String genre : obj.optString("Genre", "").split(",")) { // mp.getGenres().add(genre); // } // for (String director : obj.optString("Director", "").split(",")) { // mp.getDirectors().add(director); // } // for (String actor : obj.optString("Actors", "").split(",")) { // mp.getActors().add(actor); // } return mp; } private String generateUrl(String id) { return "http://www.imdbapi.com/?i=" + id + "&plot=full&r=JSON&tomatoes=true"; } private String generateSearchUrl(String id) { try { return "http://www.imdbapi.com/?t=" + URLEncoder.encode(id,"UTF8") + "&plot=full&r=JSON&tomatoes=true"; } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } } @Override public MovieService getService() { return IMDB_API; } }