Example #1
0
    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())
Example #2
0
    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())
Example #3
0
    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())
Example #4
0
    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())
Example #5
0
    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)]
Example #6
0
    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)]
Example #7
0
    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)]