From aa0a84bc2636a3b7f385ee75ed8ab5b2d3386ea1 Mon Sep 17 00:00:00 2001 From: Astyan-42 Date: Wed, 1 Feb 2017 14:02:05 +0100 Subject: [PATCH] adding theTVDBBridge (#463) * adding theTVDBBridge --- bridges/TheTVDBBridge.php | 142 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 bridges/TheTVDBBridge.php diff --git a/bridges/TheTVDBBridge.php b/bridges/TheTVDBBridge.php new file mode 100644 index 00000000..8af44032 --- /dev/null +++ b/bridges/TheTVDBBridge.php @@ -0,0 +1,142 @@ +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 and $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) { } + // 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); + } +} + + + +