def _request(self, method, url, lang=None, **kwargs): self.config['headers'].update({'Content-type': 'application/json'}) self.config['headers']['Authorization'] = 'Bearer {}'.format( self.jwt_token) self.config['headers'].update( {'Accept-Language': lang or self.config['language']}) # get response from theTVDB try: resp = WebSession(cache=self.config['cache_enabled']).request( method, urlparse.urljoin(self.config['api']['base'], url), headers=self.config['headers'], timeout=sickrage.app.config.indexer_timeout, **kwargs) except Exception as e: raise tvdb_error(str(e)) # handle requests exceptions try: if resp.status_code == 401: raise tvdb_unauthorized(resp.json()['Error']) elif resp.status_code >= 400: raise tvdb_error(resp.json()['Error']) except JSONDecodeError: try: resp.raise_for_status() except RequestException as e: raise tvdb_error(str(e)) return to_lowercase(resp.json())
def _request(self, method, url, lang=None, **kwargs): self.config['headers'].update({'Content-type': 'application/json'}) self.config['headers']['Authorization'] = 'Bearer {}'.format(self.jwt_token) self.config['headers'].update({'Accept-Language': lang or self.config['language']}) # get response from theTVDB try: resp = WebSession(cache=self.config['cache_enabled']).request( method, urlparse.urljoin(self.config['api']['base'], url), headers=self.config['headers'], timeout=sickrage.app.config.indexer_timeout, **kwargs ) except Exception as e: raise tvdb_error(str(e)) # handle requests exceptions try: if resp.status_code == 401: raise tvdb_unauthorized(resp.json()['Error']) elif resp.status_code >= 400: raise tvdb_error(resp.json()['Error']) except JSONDecodeError: try: resp.raise_for_status() except RequestException as e: raise tvdb_error(str(e)) return to_lowercase(resp.json())
def _request(self, method, url, **kwargs): self.config['headers'].update({'Content-type': 'application/json'}) if self.config['apitoken']: self.config['headers']['authorization'] = 'Bearer {}'.format( self.config['apitoken']) if self.config['language']: self.config['headers'].update( {'Accept-Language': self.config['language']}) # get response from theTVDB try: resp = sickrage.srCore.srWebSession.request( method, urlparse.urljoin(self.config['api']['base'], url), cache=self.config['cache_enabled'], headers=self.config['headers'], timeout=sickrage.srCore.srConfig.INDEXER_TIMEOUT, **kwargs) except Exception as e: raise tvdb_error(e.message) # handle requests exceptions if resp.status_code == 401: raise tvdb_unauthorized(resp.json()['Error']) elif resp.status_code >= 400: raise tvdb_error(resp.json()['Error']) return to_lowercase(resp.json())
def _request(self, method, url, lang=None, retries=3, **kwargs): self.config['headers'].update({'Content-type': 'application/json'}) self.config['headers']['Authorization'] = 'Bearer {}'.format(self.jwt_token) self.config['headers'].update({'Accept-Language': lang or self.config['language']}) self.config['headers'].update({'Accept': 'application/vnd.thetvdb.v{}'.format(self.config['api']['version'])}) for i in range(0, retries): try: # get response from theTVDB resp = WebSession(cache=self.config['cache_enabled']).request( method, urljoin(self.config['api']['base'], url), headers=self.config['headers'], timeout=sickrage.app.config.indexer_timeout, **kwargs ) except requests.exceptions.HTTPError as e: status_code = e.response.status_code error_message = e.response.text if 'application/json' in e.response.headers.get('content-type', ''): error_message = e.response.json().get('Error', error_message) if status_code == 401: raise tvdb_unauthorized(error_message) if i < retries - 1: continue raise tvdb_error(error_message) return to_lowercase(resp.json())
def _getShowData(self, sid): """Takes a series ID, gets the episodes URL and parses the TVDB XML file into the shows dict in layout: shows[series_id][season_number][episode_number] """ # Parse show information sickrage.app.log.debug('Getting all series data for {}'.format(sid)) try: # get series info in english series_info = self._request('get', self.config['api']['series'].format(id=sid), lang=self.config['api']['lang'])['data'] # translate if required to provided language if not self.config['language'] == self.config['api']['lang']: series_info.update((k, v) for k, v in self._request('get', self.config['api']['series'].format(id=sid))['data'].items() if v) except tvdb_unauthorized: raise tvdb_unauthorized except Exception as e: sickrage.app.log.debug("[{}]: Series result returned zero, ERROR: {}".format(sid, e)) raise tvdb_error("[{}]: Series result returned zero, ERROR: {}".format(sid, e)) # get series data for k, v in series_info.items(): if v is not None: if k in ['banner', 'fanart', 'poster']: v = self.config['api']['images']['prefix'].format(value=v) elif isinstance(v, list): v = '|'.join(v) else: v = self._cleanData(v) self._setShowData(sid, k, v) # Parse episode data sickrage.app.log.debug('Getting all episode data for {}'.format(sid)) episodes = [] page = pages = 1 while True: if page > pages: break r = self._request('get', self.config['api']['episodes'].format(id=sid), lang=self.config['api']['lang'], params={'page': page}) pages = r['links']['last'] try: episode_info = r['data'] # translate if required to provided language if not self.config['language'] == self.config['api']['lang']: intl_episode_info = self._request('get', self.config['api']['episodes'].format(id=sid), params={'page': page}) for i, x in enumerate(episode_info): x.update((k, v) for k, v in intl_episode_info['data'][i].items() if v) episode_info[i] = x episodes += episode_info page += 1 except tvdb_error: break if not len(episodes): sickrage.app.log.debug('Series results incomplete') return for cur_ep in episodes: try: use_dvd = False if self.config['dvdorder']: sickrage.app.log.debug('Using DVD ordering.') use_dvd = all([cur_ep.get('dvdseason'), cur_ep.get('dvdepisodenumber')]) seasnum, epno = cur_ep.get('airedseason'), cur_ep.get('airedepisodenumber') if use_dvd: seasnum, epno = cur_ep.get('dvdseason'), cur_ep.get('dvdepisodenumber') if seasnum is None or epno is None: raise Exception except Exception as e: sickrage.app.log.warning("Episode has incomplete season/episode numbers, skipping!") continue seas_no = int(float(seasnum)) ep_no = int(float(epno)) for k, v in cur_ep.items(): k = k.lower() if v is not None: if isinstance(v, list): v = '|'.join(v) else: v = self._cleanData(v) self._setItem(sid, seas_no, ep_no, k, v) # add episode image url image_url = self.config['api']['images']['prefix'].format( value='episodes/{}/{}.jpg'.format(sid, cur_ep['id'])) self._setItem(sid, seas_no, ep_no, 'filename', image_url) # set last updated self._setShowData(sid, 'last_updated', int(time.mktime(datetime.now().timetuple()))) return self.shows[int(sid)]
def _getShowData(self, sid): """Takes a series ID, gets the episodes URL and parses the TVDB XML file into the shows dict in layout: shows[series_id][season_number][episode_number] """ # Parse show information sickrage.app.log.debug('Getting all series data for {}'.format(sid)) try: # get series info in english series_info = self._request('get', self.config['api']['series'].format(id=sid), lang=self.config['api']['lang'] )['data'] # translate if required to provided language if not self.config['language'] == self.config['api']['lang']: series_info.update((k, v) for k, v in self._request('get', self.config['api']['series'].format(id=sid) )['data'].iteritems() if v) except Exception: sickrage.app.log.debug("[{}]: Series result returned zero".format(sid)) raise tvdb_error("[{}]: Series result returned zero".format(sid)) # get series data for k, v in series_info.items(): if v is not None: if k in ['banner', 'fanart', 'poster']: v = self.config['api']['images']['prefix'].format(value=v) elif isinstance(v, list): v = '|'.join(v) else: v = self._cleanData(v) self._setShowData(sid, k, v) # Parse episode data sickrage.app.log.debug('Getting all episode data for {}'.format(sid)) episodes = [] page = pages = 1 while True: if page > pages: break r = self._request('get', self.config['api']['episodes'].format(id=sid), lang=self.config['api']['lang'], params={'page': page}) pages = r['links']['last'] try: episode_info = r['data'] # translate if required to provided language if not self.config['language'] == self.config['api']['lang']: intl_episode_info = self._request('get', self.config['api']['episodes'].format(id=sid), params={'page': page}) for i, x in enumerate(episode_info): x.update((k, v) for k, v in intl_episode_info['data'][i].iteritems() if v) episode_info[i] = x episodes += episode_info page += 1 except tvdb_error: break if not len(episodes): sickrage.app.log.debug('Series results incomplete') return for cur_ep in episodes: try: use_dvd = False if self.config['dvdorder']: sickrage.app.log.debug('Using DVD ordering.') use_dvd = all([cur_ep.get('dvdseason'), cur_ep.get('dvdepisodenumber')]) seasnum, epno = cur_ep.get('airedseason'), cur_ep.get('airedepisodenumber') if use_dvd: seasnum, epno = cur_ep.get('dvdseason'), cur_ep.get('dvdepisodenumber') if seasnum is None or epno is None: raise Exception except Exception as e: sickrage.app.log.warning("Episode has incomplete season/episode numbers, skipping!") continue seas_no = int(float(seasnum)) ep_no = int(float(epno)) for k, v in cur_ep.items(): k = k.lower() if v is not None: if isinstance(v, list): v = '|'.join(v) else: v = self._cleanData(v) self._setItem(sid, seas_no, ep_no, k, v) # add episode image url image_url = self.config['api']['images']['prefix'].format( value='episodes/{}/{}.jpg'.format(sid, cur_ep['id'])) self._setItem(sid, seas_no, ep_no, 'filename', image_url) # set last updated self._setShowData(sid, 'last_updated', int(time.mktime(datetime.now().timetuple()))) return self.shows[int(sid)]
def _getShowData(self, sid): """Takes a series ID, gets the episodes URL and parses the TVDB XML file into the shows dict in layout: shows[series_id][season_number][episode_number] """ # Parse show information sickrage.srCore.srLogger.debug( 'Getting all series data for {}'.format(sid)) try: seriesInfoEt = self._request( 'get', self.config['api']['series'].format(id=sid))['data'] except Exception: sickrage.srCore.srLogger.debug( "[{}]: Series result returned zero".format(sid)) raise tvdb_error("[{}]: Series result returned zero".format(sid)) # get series data for k, v in seriesInfoEt.items(): if v is not None: if k in ['banner', 'fanart', 'poster']: v = self.config['api']['imagesPrefix'].format(id=v) elif isinstance(v, list): v = '|'.join(v) else: v = self._cleanData(v) self._setShowData(sid, k, v) # Parse images self._parseImages(sid) # Parse actors self._parseActors(sid) # Parse episode data sickrage.srCore.srLogger.debug( 'Getting all episode data for {}'.format(sid)) p = 1 episodes = [] while True: try: episodes += self._request( 'get', self.config['api']['episodes'].format(id=sid), params={'page': p})['data'] p += 1 except tvdb_error: break if not len(episodes): sickrage.srCore.srLogger.debug('Series results incomplete') return for cur_ep in episodes: try: use_dvd = False if self.config['dvdorder']: sickrage.srCore.srLogger.debug('Using DVD ordering.') use_dvd = all([ cur_ep.get('dvdseason'), cur_ep.get('dvdepisodenumber') ]) seasnum, epno = cur_ep.get('airedseason'), cur_ep.get( 'airedepisodenumber') if use_dvd: seasnum, epno = cur_ep.get('dvdseason'), cur_ep.get( 'dvdepisodenumber') if seasnum is None or epno is None: raise Exception except Exception as e: sickrage.srCore.srLogger.warning( "Episode has incomplete season/episode numbers, skipping!") continue seas_no = int(float(seasnum)) ep_no = int(float(epno)) for k, v in cur_ep.items(): k = k.lower() if v is not None: if k == 'filename': v = self.config['api']['imagesPrefix'].format(id=v) elif isinstance(v, list): v = '|'.join(v) else: v = self._cleanData(v) self._setItem(sid, seas_no, ep_no, k, v) # set last updated self._setShowData( sid, 'last_updated', int(time.mktime(datetime.datetime.now().timetuple()))) return self.shows[int(sid)]