_apikey = (string) $apikey; $this->_apischeme = ($scheme == TMDb::API_SCHEME) ? TMDb::API_SCHEME : TMDb::API_SCHEME_SSL; $this->setLang($default_lang); if($config === TRUE) { $this->getConfiguration(); } } /** * Search a movie by querystring * * @param string $text Query to search after in the TMDb database * @param int $page Number of the page with results (default first page) * @param bool $adult Whether of not to include adult movies in the results (default FALSE) * @param mixed $lang Filter the result with a language (ISO 3166-1) other then default, use FALSE to retrieve results from all languages * @return TMDb result array */ public function searchMovie($query, $page = 1, $adult = FALSE, $year = NULL, $lang = NULL) { $params = array( 'query' => $query, 'page' => (int) $page, 'language' => ($lang !== NULL) ? $lang : $this->getLang(), 'include_adult' => (bool) $adult, 'year' => $year, ); return $this->_makeCall('search/movie', $params); } /** * Search a person by querystring * * @param string $text Query to search after in the TMDb database * @param int $page Number of the page with results (default first page) * @param bool $adult Whether of not to include adult movies in the results (default FALSE) * @return TMDb result array */ public function searchPerson($query, $page = 1, $adult = FALSE) { $params = array( 'query' => $query, 'page' => (int) $page, 'include_adult' => (bool) $adult, ); return $this->_makeCall('search/person', $params); } /** * Search a company by querystring * * @param string $text Query to search after in the TMDb database * @param int $page Number of the page with results (default first page) * @return TMDb result array */ public function searchCompany($query, $page = 1) { $params = array( 'query' => $query, 'page' => $page, ); return $this->_makeCall('search/company', $params); } /** * Retrieve information about a collection * * @param int $id Id from a collection (retrieved with getMovie) * @param mixed $lang Filter the result with a language (ISO 3166-1) other then default, use FALSE to retrieve results from all languages * @return TMDb result array */ public function getCollection($id, $lang = NULL) { $params = array( 'language' => ($lang !== NULL) ? $lang : $this->getLang(), ); return $this->_makeCall('collection/'.$id, $params); } /** * Retrieve all basic information for a particular movie * * @param mixed $id TMDb-id or IMDB-id * @param mixed $lang Filter the result with a language (ISO 3166-1) other then default, use FALSE to retrieve results from all languages * @return TMDb result array */ public function getMovie($id, $lang = NULL) { $params = array( 'language' => ($lang !== NULL) ? $lang : $this->getLang(), ); return $this->_makeCall('movie/'.$id, $params); } /** * Retrieve alternative titles for a particular movie * * @param mixed $id TMDb-id or IMDB-id * @params string $country Only include titles for a particular country (ISO 3166-1) * @return TMDb result array */ public function getMovieTitles($id, $country = NULL) { $params = array( 'country' => $country, ); return $this->_makeCall('movie/'.$id.'/alternative_titles', $params); } /** * Retrieve all of the movie cast information for a particular movie * * @param mixed $id TMDb-id or IMDB-id * @return TMDb result array */ public function getMovieCast($id) { return $this->_makeCall('movie/'.$id.'/casts'); } /** * Retrieve all of the keywords for a particular movie * * @param mixed $id TMDb-id or IMDB-id * @return TMDb result array */ public function getMovieKeywords($id) { return $this->_makeCall('movie/'.$id.'/keywords'); } /** * Retrieve all the release and certification data for a particular movie * * @param mixed $id TMDb-id or IMDB-id * @return TMDb result array */ public function getMovieReleases($id) { return $this->_makeCall('movie/'.$id.'/releases'); } /** * Retrieve available translations for a particular movie * * @param mixed $id TMDb-id or IMDB-id * @return TMDb result array */ public function getMovieTranslations($id) { return $this->_makeCall('movie/'.$id.'/translations'); } /** * Retrieve available trailers for a particular movie * * @param mixed $id TMDb-id or IMDB-id * @param mixed $lang Filter the result with a language (ISO 3166-1) other then default, use FALSE to retrieve results from all languages * @return TMDb result array */ public function getMovieTrailers($id, $lang = NULL) { $params = array( 'language' => ($lang !== NULL) ? $lang : $this->getLang(), ); return $this->_makeCall('movie/'.$id.'/trailers', $params); } /** * Retrieve all images for a particular movie * * @param mixed $id TMDb-id or IMDB-id * @param mixed $lang Filter the result with a language (ISO 3166-1) other then default, use FALSE to retrieve results from all languages * @return TMDb result array */ public function getMovieImages($id, $lang = NULL) { $params = array( 'language' => ($lang !== NULL) ? $lang : $this->getLang(), ); return $this->_makeCall('movie/'.$id.'/images', $params); } /** * Retrieve similar movies for a particular movie * * @param mixed $id TMDb-id or IMDB-id * @param int $page Number of the page with results (default first page) * @param mixed $lang Filter the result with a language (ISO 3166-1) other then default, use FALSE to retrieve results from all languages * @return TMDb result array */ public function getSimilarMovies($id, $page = 1, $lang = NULL) { $params = array( 'page' => (int) $page, 'language' => ($lang !== NULL) ? $lang : $this->getLang(), ); return $this->_makeCall('movie/'.$id.'/similar_movies', $params); } /** * Retrieve newest movie added to TMDb * * @return TMDb result array */ public function getLatestMovie() { return $this->_makeCall('movie/latest'); } /** * Retrieve movies arriving to theatres within the next few weeks * * @param int $page Number of the page with results (default first page) * @param mixed $lang Filter the result with a language (ISO 3166-1) other then default, use FALSE to retrieve results from all languages * @return TMDb result array */ public function getUpcomingMovies($page = 1, $lang = NULL) { $params = array( 'page' => (int) $page, 'language' => ($lang !== NULL) ? $lang : $this->getLang(), ); return $this->_makeCall('movie/upcoming', $params); } /** * Retrieve movies currently in theatres * * @param int $page Number of the page with results (default first page) * @param mixed $lang Filter the result with a language (ISO 3166-1) other then default, use FALSE to retrieve results from all languages * @return TMDb result array */ public function getNowPlayingMovies($page = 1, $lang = NULL) { $params = array( 'page' => (int) $page, 'language' => ($lang !== NULL) ? $lang : $this->getLang(), ); return $this->_makeCall('movie/now_playing', $params); } /** * Retrieve popular movies (list is updated daily) * * @param int $page Number of the page with results (default first page) * @param mixed $lang Filter the result with a language (ISO 3166-1) other then default, use FALSE to retrieve results from all languages * @return TMDb result array */ public function getPopularMovies($page = 1, $lang = NULL) { $params = array( 'page' => (int) $page, 'language' => ($lang !== NULL) ? $lang : $this->getLang(), ); return $this->_makeCall('movie/popular', $params); } /** * Retrieve top-rated movies * * @param int $page Number of the page with results (default first page) * @param mixed $lang Filter the result with a language (ISO 3166-1) other then default, use FALSE to retrieve results from all languages * @return TMDb result array */ public function getTopRatedMovies($page = 1, $lang = NULL) { $params = array( 'page' => (int) $page, 'language' => ($lang !== NULL) ? $lang : $this->getLang(), ); return $this->_makeCall('movie/top_rated', $params); } /** * Retrieve changes for a particular movie * * @param mixed $id TMDb-id or IMDB-id * @return TMDb result array */ public function getMovieChanges($id) { return $this->_makeCall('movie/'.$id.'/changes'); } /** * Retrieve all id's from changed movies * * @param int $page Number of the page with results (default first page) * @param string $start_date String start date as YYYY-MM-DD * @param string $end_date String end date as YYYY-MM-DD (not inclusive) * @return TMDb result array */ public function getChangedMovies($page = 1, $start_date = NULL, $end_date = NULL) { $params = array( 'page' => (int) $page, 'start_date' => $start_date, 'end_date' => $end_date, ); return $this->_makeCall('movie/changes', $params); } /** * Retrieve all basic information for a particular person * * @param int $id TMDb person-id * @return TMDb result array */ public function getPerson($id) { return $this->_makeCall('person/'.$id); } /** * Retrieve all cast and crew information for a particular person * * @param int $id TMDb person-id * @param mixed $lang Filter the result with a language (ISO 3166-1) other then default, use FALSE to retrieve results from all languages * @return TMDb result array */ public function getPersonCredits($id, $lang = NULL) { $params = array( 'language' => ($lang !== NULL) ? $lang : $this->getLang(), ); return $this->_makeCall('person/'.$id.'/credits', $params); } /** * Retrieve all images for a particular person * * @param mixed $id TMDb person-id * @return TMDb result array */ public function getPersonImages($id) { return $this->_makeCall('person/'.$id.'/images'); } /** * Retrieve changes for a particular person * * @param mixed $id TMDb person-id * @return TMDb result array */ public function getPersonChanges($id) { return $this->_makeCall('person/'.$id.'/changes'); } /** * Retrieve all id's from changed persons * * @param int $page Number of the page with results (default first page) * @param string $start_date String start date as YYYY-MM-DD * @param string $end_date String end date as YYYY-MM-DD (not inclusive) * @return TMDb result array */ public function getChangedPersons($page = 1, $start_date = NULL, $end_date = NULL) { $params = array( 'page' => (int) $page, 'start_date' => $start_date, 'start_date' => $end_date, ); return $this->_makeCall('person/changes', $params); } /** * Retrieve all basic information for a particular production company * * @param int $id TMDb company-id * @return TMDb result array */ public function getCompany($id) { return $this->_makeCall('company/'.$id); } /** * Retrieve movies for a particular production company * * @param int $id TMDb company-id * @param int $page Number of the page with results (default first page) * @param mixed $lang Filter the result with a language (ISO 3166-1) other then default, use FALSE to retrieve results from all languages * @return TMDb result array */ public function getMoviesByCompany($id, $page = 1, $lang = NULL) { $params = array( 'page' => (int) $page, 'language' => ($lang !== NULL) ? $lang : $this->getLang(), ); return $this->_makeCall('company/'.$id.'/movies', $params); } /** * Retrieve a list of genres used on TMDb * * @param mixed $lang Filter the result with a language (ISO 3166-1) other then default, use FALSE to retrieve results from all languages * @return TMDb result array */ public function getGenres($lang = NULL) { $params = array( 'language' => ($lang !== NULL) ? $lang : $this->getLang(), ); return $this->_makeCall('genre/list', $params); } /** * Retrieve movies for a particular genre * * @param int $id TMDb genre-id * @param int $page Number of the page with results (default first page) * @param mixed $lang Filter the result with a language (ISO 3166-1) other then default, use FALSE to retrieve results from all languages * @return TMDb result array */ public function getMoviesByGenre($id, $page = 1, $lang = NULL) { $params = array( 'page' => (int) $page, 'language' => ($lang !== NULL) ? $lang : $this->getLang(), ); return $this->_makeCall('genre/'.$id.'/movies', $params); } /** * Authentication: retrieve authentication token * More information about the authentication process: http://help.themoviedb.org/kb/api/user-authentication * * @return TMDb result array */ public function getAuthToken() { $result = $this->_makeCall('authentication/token/new'); if( ! isset($result['request_token'])) { if($this->getDebugMode()) { throw new TMDbException('No valid request token from TMDb'); } else { return FALSE; } } return $result; } /** * Authentication: retrieve authentication session and set it to the class * More information about the authentication process: http://help.themoviedb.org/kb/api/user-authentication * * @param string $token * @return TMDb result array */ public function getAuthSession($token) { $params = array( 'request_token' => $token, ); $result = $this->_makeCall('authentication/session/new', $params); if(isset($result['session_id'])) { $this->setAuthSession($result['session_id']); } return $result; } /** * Authentication: set retrieved session id in the class for authenticated requests * More information about the authentication process: http://help.themoviedb.org/kb/api/user-authentication * * @param string $session_id */ public function setAuthSession($session_id) { $this->_session_id = $session_id; } /** * Retrieve basic account information * * @param string $session_id Set session_id for the account you want to retrieve information from * @return TMDb result array */ public function getAccount($session_id = NULL) { $session_id = ($session_id === NULL) ? $this->_session_id : $session_id; return $this->_makeCall('account', NULL, $session_id); } /** * Retrieve favorite movies for a particular account * * @param int $account_id TMDb account-id * @param string $session_id Set session_id for the account you want to retrieve information from * @param int $page Number of the page with results (default first page) * @param mixed $lang Get result in other language then default for this user account (ISO 3166-1) * @return TMDb result array */ public function getAccountFavoriteMovies($account_id, $session_id = NULL, $page = 1, $lang = FALSE) { $session_id = ($session_id === NULL) ? $this->_session_id : $session_id; $params = array( 'page' => (int) $page, 'language' => ($lang !== NULL) ? $lang : '', ); return $this->_makeCall('account/'.$account_id.'/favorite_movies', $params, $session_id); } /** * Retrieve rated movies for a particular account * * @param int $account_id TMDb account-id * @param string $session_id Set session_id for the account you want to retrieve information from * @param int $page Number of the page with results (default first page) * @param mixed $lang Get result in other language then default for this user account (ISO 3166-1) * @return TMDb result array */ public function getAccountRatedMovies($account_id, $session_id = NULL, $page = 1, $lang = FALSE) { $session_id = ($session_id === NULL) ? $this->_session_id : $session_id; $params = array( 'page' => (int) $page, 'language' => ($lang !== NULL) ? $lang : '', ); return $this->_makeCall('account/'.$account_id.'/rated_movies', $params, $session_id); } /** * Retrieve movies that have been marked in a particular account watchlist * * @param int $account_id TMDb account-id * @param string $session_id Set session_id for the account you want to retrieve information from * @param int $page Number of the page with results (default first page) * @param mixed $lang Get result in other language then default for this user account (ISO 3166-1) * @return TMDb result array */ public function getAccountWatchlistMovies($account_id, $session_id = NULL, $page = 1, $lang = FALSE) { $session_id = ($session_id === NULL) ? $this->_session_id : $session_id; $params = array( 'page' => (int) $page, 'language' => ($lang !== NULL) ? $lang : '', ); return $this->_makeCall('account/'.$account_id.'/movie_watchlist', $params, $session_id); } /** * Add a movie to the account favorite movies * * @param int $account_id TMDb account-id * @param string $session_id Set session_id for the account you want to retrieve information from * @param int $movie_id TMDb movie-id * @param bool $favorite Add to favorites or remove from favorites (default TRUE) * @return TMDb result array */ public function addFavoriteMovie($account_id, $session_id = NULL, $movie_id = 0, $favorite = TRUE) { $session_id = ($session_id === NULL) ? $this->_session_id : $session_id; $params = array( 'movie_id' => (int) $movie_id, 'favorite' => (bool) $favorite, ); return $this->_makeCall('account/'.$account_id.'/favorite', $params, $session_id, TMDb::POST); } /** * Add a movie to the account watchlist * * @param int $account_id TMDb account-id * @param string $session_id Set session_id for the account you want to retrieve information from * @param int $movie_id TMDb movie-id * @param bool $watchlist Add to watchlist or remove from watchlist (default TRUE) * @return TMDb result array */ public function addMovieToWatchlist($account_id, $session_id = NULL, $movie_id = 0, $watchlist = TRUE) { $session_id = ($session_id === NULL) ? $this->_session_id : $session_id; $params = array( 'movie_id' => (int) $movie_id, 'movie_watchlist' => (bool) $watchlist, ); return $this->_makeCall('account/'.$account_id.'/movie_watchlist', $params, $session_id, TMDb::POST); } /** * Add a rating to a movie * * @param string $session_id Set session_id for the account you want to retrieve information from * @param int $movie_id TMDb movie-id * @param float $value Value between 1 and 10 * @return TMDb result array */ public function addMovieRating($session_id = NULL, $movie_id = 0, $value = 0) { $session_id = ($session_id === NULL) ? $this->_session_id : $session_id; $params = array( 'value' => is_numeric($value) ? floatval($value) : 0, ); return $this->_makeCall('movie/'.$movie_id.'/rating', $params, $session_id, TMDb::POST); } /** * Get configuration from TMDb * * @return TMDb result array */ public function getConfiguration() { $config = $this->_makeCall('configuration'); if( ! empty($config)) { $this->setConfig($config); } return $config; } /** * Get Image URL * * @param string $filepath Filepath to image * @param const $imagetype Image type: TMDb::IMAGE_BACKDROP, TMDb::IMAGE_POSTER, TMDb::IMAGE_PROFILE * @param string $size Valid size for the image * @return string */ public function getImageUrl($filepath, $imagetype, $size) { $config = $this->getConfig(); if(isset($config['images'])) { $base_url = $config['images']['secure_base_url']; $available_sizes = $this->getAvailableImageSizes($imagetype); if(in_array($size, $available_sizes)) { return $base_url.$size.$filepath; } else { throw new TMDbException('The size "'.$size.'" is not supported by TMDb'); } } else { throw new TMDbException('No configuration available for image URL generation'); } } /** * Get available image sizes for a particular image type * * @param const $imagetype Image type: TMDb::IMAGE_BACKDROP, TMDb::IMAGE_POSTER, TMDb::IMAGE_PROFILE * @return array */ public function getAvailableImageSizes($imagetype) { $config = $this->getConfig(); if(isset($config['images'][$imagetype.'_sizes'])) { return $config['images'][$imagetype.'_sizes']; } else { throw new TMDbException('No configuration available to retrieve available image sizes'); } } /** * Get ETag to keep track of state of the content * * @param string $uri Use an URI to know the version of it. For example: 'movie/550' * @return string */ public function getVersion($uri) { $headers = $this->_makeCall($uri, NULL, NULL, TMDb::HEAD); return isset($headers['Etag']) ? $headers['Etag'] : ''; } /** * Makes the call to the API * * @param string $function API specific function name for in the URL * @param array $params Unencoded parameters for in the URL * @param string $session_id Session_id for authentication to the API for specific API methods * @param const $method TMDb::GET or TMDb:POST (default TMDb::GET) * @return TMDb result array */ private function _makeCall($function, $params = NULL, $session_id = NULL, $method = TMDb::GET) { $params = ( ! is_array($params)) ? array() : $params; $auth_array = array('api_key' => $this->_apikey); if($session_id !== NULL) { $auth_array['session_id'] = $session_id; } $url = $this->_apischeme.TMDb::API_URL.'/'.TMDb::API_VERSION.'/'.$function.'?'.http_build_query($auth_array, '', '&'); if($method === TMDb::GET) { if(isset($params['language']) AND $params['language'] === FALSE) { unset($params['language']); } $url .= ( ! empty($params)) ? '&'.http_build_query($params, '', '&') : ''; } $results = '{}'; if (extension_loaded('curl')) { $headers = array( 'Accept: application/json', ); $ch = curl_init(); if($method == TMDB::POST) { $json_string = json_encode($params); curl_setopt($ch,CURLOPT_POST, 1); curl_setopt($ch,CURLOPT_POSTFIELDS, $json_string); $headers[] = 'Content-Type: application/json'; $headers[] = 'Content-Length: '.strlen($json_string); } elseif($method == TMDb::HEAD) { curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'HEAD'); curl_setopt($ch, CURLOPT_NOBODY, 1); } curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $response = curl_exec($ch); $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); $header = substr($response, 0, $header_size); $body = substr($response, $header_size); $error_number = curl_errno($ch); $error_message = curl_error($ch); if($error_number > 0) { throw new TMDbException('Method failed: '.$function.' - '.$error_message); } curl_close($ch); } else { throw new TMDbException('CURL-extension not loaded'); } $results = json_decode($body, TRUE); if(strpos($function, 'authentication/token/new') !== FALSE) { $parsed_headers = $this->_http_parse_headers($header); $results['Authentication-Callback'] = $parsed_headers['Authentication-Callback']; } if($results !== NULL) { return $results; } elseif($method == TMDb::HEAD) { return $this->_http_parse_headers($header); } else { throw new TMDbException('Server error on "'.$url.'": '.$response); } } /** * Setter for the default language * * @param string $lang (ISO 3166-1) * @return void */ public function setLang($lang) { $this->_lang = $lang; } /** * Setter for the TMDB-config * * $param array $config * @return void */ public function setConfig($config) { $this->_config = $config; } /** * Getter for the default language * * @return string */ public function getLang() { return $this->_lang; } /** * Getter for the TMDB-config * * @return array */ public function getConfig() { if(empty($this->_config)) { $this->_config = $this->getConfiguration(); } return $this->_config; } /* * Internal function to parse HTTP headers because of lack of PECL extension installed by many * * @param string $header * @return array */ protected function _http_parse_headers($header) { $return = array(); $fields = explode("\r\n", preg_replace('/\x0D\x0A[\x09\x20]+/', ' ', $header)); foreach($fields as $field) { if(preg_match('/([^:]+): (.+)/m', $field, $match)) { $match[1] = preg_replace('/(?<=^|[\x09\x20\x2D])./e', 'strtoupper("\0")', strtolower(trim($match[1]))); if( isset($return[$match[1]]) ) { $return[$match[1]] = array($return[$match[1]], $match[2]); } else { $return[$match[1]] = trim($match[2]); } } } return $return; } } /** * TMDb Exception class * * @author Jonas De Smet - Glamorous */ class TMDbException extends Exception{} ?>