All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.omertron.omdbapi.OmdbApi Maven / Gradle / Ivy

There is a newer version: 1.5
Show newest version
/*
 *      Copyright (c) 2013-2016 Stuart Boston
 *
 *      This file is part of the OMDB API.
 *
 *      The OMDB API is free software: you can redistribute it and/or modify
 *      it under the terms of the GNU General Public License as published by
 *      the Free Software Foundation, either version 3 of the License, or
 *      any later version.
 *
 *      The OMDB API is distributed in the hope that it will be useful,
 *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *      GNU General Public License for more details.
 *
 *      You should have received a copy of the GNU General Public License
 *      along with the OMDB API.  If not, see .
 *
 */
package com.omertron.omdbapi;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.omertron.omdbapi.model.OmdbVideoFull;
import com.omertron.omdbapi.model.SearchResults;
import com.omertron.omdbapi.tools.OmdbBuilder;
import com.omertron.omdbapi.tools.OmdbParameters;
import com.omertron.omdbapi.tools.OmdbUrlBuilder;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.charset.Charset;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.protocol.HTTP;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.yamj.api.common.exception.ApiExceptionType;
import org.yamj.api.common.http.DigestedResponse;
import org.yamj.api.common.http.DigestedResponseReader;
import org.yamj.api.common.http.SimpleHttpClientBuilder;
import org.yamj.api.common.http.UserAgentSelector;

/**
 * The main class for the OMDB API
 *
 * @author stuart.boston
 */
public class OmdbApi {

    private static final Logger LOG = LoggerFactory.getLogger(OmdbApi.class);
    private final HttpClient httpClient;
    // Jackson JSON configuration
    private static ObjectMapper mapper = new ObjectMapper();
    // HTTP Status codes
    private static final int HTTP_STATUS_300 = 300;
    private static final int HTTP_STATUS_500 = 500;
    private static final String DEFAULT_CHARSET = "UTF-8";
    private final Charset charset;

    /**
     * Create an instance of the API with a default HTTP Client
     */
    public OmdbApi() {
        this(new SimpleHttpClientBuilder().build());
    }

    /**
     * Create an instance of the API with the provided HTTP Client
     *
     * @param httpClient
     */
    public OmdbApi(HttpClient httpClient) {
        this.httpClient = httpClient;
        this.charset = Charset.forName(DEFAULT_CHARSET);
    }

    private String requestWebPage(URL url) throws OMDBException {
        LOG.trace("Requesting: {}", url.toString());
        try {
            final HttpGet httpGet = new HttpGet(url.toURI());
            httpGet.addHeader("accept", "application/json");
            httpGet.addHeader(HTTP.USER_AGENT, UserAgentSelector.randomUserAgent());

            final DigestedResponse response = DigestedResponseReader.requestContent(httpClient, httpGet, charset);

            if (response.getStatusCode() >= HTTP_STATUS_500) {
                throw new OMDBException(ApiExceptionType.HTTP_503_ERROR, response.getContent(), response.getStatusCode(), url);
            } else if (response.getStatusCode() >= HTTP_STATUS_300) {
                throw new OMDBException(ApiExceptionType.HTTP_404_ERROR, response.getContent(), response.getStatusCode(), url);
            }

            return response.getContent();
        } catch (URISyntaxException ex) {
            throw new OMDBException(ApiExceptionType.INVALID_URL, "Invalid URL", url, ex);
        } catch (IOException ex) {
            throw new OMDBException(ApiExceptionType.CONNECTION_ERROR, "Error retrieving URL", url, ex);
        }
    }

    /**
     * Execute a search using the passed parameters.
     *
     * To create the parameters use the OmdbBuilder builder:
     * 

* E.G.: build(new OmdbBuilder(term).setYear(1900).build()); * * @param searchParams Use the OmdbBuilder to build the parameters * @return * @throws com.omertron.omdbapi.OMDBException */ public SearchResults search(OmdbParameters searchParams) throws OMDBException { SearchResults resultList; String url = OmdbUrlBuilder.create(searchParams); LOG.info("URL: {}", url); // Get the JSON String jsonData = requestWebPage(OmdbUrlBuilder.generateUrl(url)); // Process the JSON into an object try { resultList = mapper.readValue(jsonData, SearchResults.class); } catch (IOException ex) { throw new OMDBException(ApiExceptionType.MAPPING_FAILED, jsonData, 0, url, ex); } return resultList; } /** * Get a list of movies using the movie title. * * @param title * @return * @throws OMDBException */ public SearchResults search(String title) throws OMDBException { return search(new OmdbBuilder() .setSearchTerm(title) .build()); } /** * Get a list of movies using the movie title and year. * * @param title * @param year * @return * @throws OMDBException */ public SearchResults search(String title, int year) throws OMDBException { return search(new OmdbBuilder() .setSearchTerm(title) .setYear(year) .build()); } /** * Get movie information using the supplied parameters * * @param parameters parameters to use to retrieve the information * @return * @throws OMDBException */ public OmdbVideoFull getInfo(OmdbParameters parameters) throws OMDBException { OmdbVideoFull result; URL url = OmdbUrlBuilder.createUrl(parameters); // Get the JSON String jsonData = requestWebPage(url); // Process the JSON into an object try { result = mapper.readValue(jsonData, OmdbVideoFull.class); if (result == null || !result.isResponse()) { throw new OMDBException(ApiExceptionType.ID_NOT_FOUND, result == null ? "No data returned" : result.getError()); } } catch (IOException ex) { throw new OMDBException(ApiExceptionType.MAPPING_FAILED, jsonData, 0, url, ex); } return result; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy