123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- <?php
- class TheTVDBBridge extends BridgeAbstract {
- const MAINTAINER = 'Astyan';
- const NAME = 'TheTVDB';
- const URI = 'http://thetvdb.com/';
- const APIURI = 'https://api.thetvdb.com/';
- const CACHE_TIMEOUT = 43200; // 12h
- const DESCRIPTION = 'Returns latest episodes of a serie with theTVDB api. You can contribute to theTVDB.';
- const PARAMETERS = array(
- array(
- 'serie_id' => array(
- 'type' => 'number',
- 'name' => 'ID',
- 'required' => true,
- ),
- 'nb_episode' => array(
- 'type' => 'number',
- 'name' => 'Number of episodes',
- 'defaultValue' => 10,
- 'required' => true,
- ),
- )
- );
- const APIACCOUNT = 'RSSBridge';
- const APIKEY = '76DE1887EA401C9A';
- const APIUSERKEY = 'B52869AC6005330F';
- private function getApiUri(){
- return self::APIURI;
- }
- private function getToken(){
- //login and get token, don't use curlJob to do less adaptations
- $login_array = array(
- 'apikey' => self::APIKEY,
- 'username' => self::APIACCOUNT,
- 'userkey' => self::APIUSERKEY
- );
- $login_json = json_encode($login_array);
- $ch = curl_init($this->getApiUri() . 'login');
- curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
- curl_setopt($ch, CURLOPT_POSTFIELDS, $login_json);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_HTTPHEADER, array(
- 'Content-Type: application/json',
- 'Accept: application/json'
- )
- );
- curl_setopt($ch, CURLOPT_TIMEOUT, 5);
- curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
- $result = curl_exec($ch);
- curl_close($ch);
- $token_json = (array)json_decode($result);
- if(isset($token_json['Error'])) {
- throw new Exception($token_json['Error']);
- die;
- }
- $token = $token_json['token'];
- return $token;
- }
- private function curlJob($token, $url){
- $token_header = 'Authorization: Bearer ' . $token;
- $ch = curl_init($url);
- curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_HTTPHEADER, array(
- 'Accept: application/json',
- $token_header
- )
- );
- curl_setopt($ch, CURLOPT_TIMEOUT, 5);
- curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
- $result = curl_exec($ch);
- curl_close($ch);
- $result_array = (array)json_decode($result);
- if(isset($result_array['Error'])) {
- throw new Exception($result_array['Error']);
- die;
- }
- return $result_array;
- }
- private function getLatestSeasonNumber($token, $serie_id){
- // get the last season
- $url = $this->getApiUri() . 'series/' . $serie_id . '/episodes/summary';
- $summary = $this->curlJob($token, $url);
- return max($summary['data']->airedSeasons);
- }
- private function getSerieName($token, $serie_id){
- $url = $this->getApiUri() . 'series/' . $serie_id;
- $serie = $this->curlJob($token, $url);
- return $serie['data']->seriesName;
- }
- private function getSeasonEpisodes($token,
- $serie_id,
- $season,
- $seriename,
- &$episodelist,
- $nbepisodemin,
- $page = 1){
- $url = $this->getApiUri()
- . 'series/'
- . $serie_id
- . '/episodes/query?airedSeason='
- . $season
- . '?page='
- . $page;
- $episodes = $this->curlJob($token, $url);
- // we don't check the number of page because we assume there is less
- //than 100 episodes in every season
- $episodes = (array)$episodes['data'];
- $episodes = array_slice($episodes, -$nbepisodemin, $nbepisodemin);
- foreach($episodes as $episode) {
- $episodedata = array();
- $episodedata['uri'] = $this->getURI()
- . '?tab=episode&seriesid='
- . $serie_id
- . '&seasonid='
- . $episode->airedSeasonID
- . '&id='
- . $episode->id;
- // check if the absoluteNumber exist
- if(isset($episode->absoluteNumber)) {
- $episodedata['title'] = 'S'
- . $episode->airedSeason
- . 'E'
- . $episode->airedEpisodeNumber
- . '('
- . $episode->absoluteNumber
- . ') : '
- . $episode->episodeName;
- } else {
- $episodedata['title'] = 'S'
- . $episode->airedSeason
- . 'E'
- . $episode->airedEpisodeNumber
- . ' : '
- . $episode->episodeName;
- }
- $episodedata['author'] = $seriename;
- $date = DateTime::createFromFormat(
- 'Y-m-d H:i:s',
- $episode->firstAired . ' 00:00:00'
- );
- $episodedata['timestamp'] = $date->getTimestamp();
- $episodedata['content'] = $episode->overview;
- $episodelist[] = $episodedata;
- }
- }
- public function collectData(){
- $serie_id = $this->getInput('serie_id');
- $nbepisode = $this->getInput('nb_episode');
- $episodelist = array();
- $token = $this->getToken();
- $maxseason = $this->getLatestSeasonNumber($token, $serie_id);
- $seriename = $this->getSerieName($token, $serie_id);
- $season = $maxseason;
- while(sizeof($episodelist) < $nbepisode && $season >= 1) {
- $nbepisodetmp = $nbepisode - sizeof($episodelist);
- $this->getSeasonEpisodes(
- $token,
- $serie_id,
- $season,
- $seriename,
- $episodelist,
- $nbepisodetmp
- );
- $season = $season - 1;
- }
- // add the 10 last specials episodes
- try { // catch to avoid error if empty
- $this->getSeasonEpisodes(
- $token,
- $serie_id,
- 0,
- $seriename,
- $episodelist,
- $nbepisode
- );
- } catch(Exception $e) {
- unset($e);
- }
- // sort and keep the 10 last episodes, works bad with the netflix serie
- // (all episode lauch at once)
- usort(
- $episodelist,
- function ($a, $b){
- return $a['timestamp'] < $b['timestamp'];
- }
- );
- $this->items = array_slice($episodelist, 0, $nbepisode);
- }
- }
|