Beispiel #1
0
 def map_show_keys(data):
     keep_data = {}
     del_keys = []
     new_data = {}
     for k, v in data.iteritems():
         k_org = k
         k = k.lower()
         if None is not v:
             if k in ['banner', 'fanart', 'poster'] and v:
                 v = self.config['url_artworkPrefix'] % v
             elif 'genre' == k:
                 keep_data['genre_list'] = v
                 v = '|%s|' % '|'.join([
                     clean_data(c)
                     for c in v if isinstance(c, basestring)
                 ])
             elif 'gueststars' == k:
                 keep_data['gueststars_list'] = v
                 v = '|%s|' % '|'.join([
                     clean_data(c)
                     for c in v if isinstance(c, basestring)
                 ])
             elif 'writers' == k:
                 keep_data[k] = v
                 v = '|%s|' % '|'.join([
                     clean_data(c)
                     for c in v if isinstance(c, basestring)
                 ])
             elif 'firstaired' == k:
                 if v:
                     try:
                         v = parse(v, fuzzy=True).strftime('%Y-%m-%d')
                     except (StandardError, Exception):
                         v = None
                 else:
                     v = None
             elif 'imdbid' == k:
                 if v:
                     if re.search(r'^(tt)?\d{1,7}$', v, flags=re.I):
                         v = clean_data(v)
                     else:
                         v = ''
             else:
                 v = clean_data(v)
         if k in map_show:
             k = map_show[k]
         if k_org is not k:
             del_keys.append(k_org)
             new_data[k] = v
         else:
             data[k] = v
     for d in del_keys:
         del (data[d])
     if isinstance(data, dict):
         data.update(new_data)
         data.update(keep_data)
     return data
Beispiel #2
0
        def map_show_keys(data):
            keep_data = {}
            del_keys = []
            new_data = {}
            for k, v in data.iteritems():
                k_org = k
                k = k.lower()
                if None is not v:
                    if k in ['banner', 'fanart', 'poster'] and v:
                        v = self.config['url_artworkPrefix'] % v
                    elif 'genre' == k:
                        keep_data['genre_list'] = v
                        v = '|%s|' % '|'.join([clean_data(c) for c in v if isinstance(c, basestring)])
                    elif 'gueststars' == k:
                        keep_data['gueststars_list'] = v
                        v = '|%s|' % '|'.join([clean_data(c) for c in v if isinstance(c, basestring)])
                    elif 'writers' == k:
                        keep_data[k] = v
                        v = '|%s|' % '|'.join([clean_data(c) for c in v if isinstance(c, basestring)])
                    elif 'firstaired' == k:
                        if v:
                            try:
                                v = parse(v, fuzzy=True).strftime('%Y-%m-%d')
                            except (StandardError, Exception):
                                v = None
                        else:
                            v = None
                    elif 'imdbid' == k:
                        if v:
                            if re.search(r'^(tt)?\d{1,7}$', v, flags=re.I):
                                v = clean_data(v)
                            else:
                                v = ''
                    else:
                        v = clean_data(v)
                else:
                    if 'seriesname' == k:
                        if isinstance(data.get('aliases'), list) and 0 < len(data.get('aliases')):
                            v = data['aliases'].pop(0)
                        # this is a invalid show, it has no Name
                        if None is v:
                            return None

                if k in map_show:
                    k = map_show[k]
                if k_org is not k:
                    del_keys.append(k_org)
                    new_data[k] = v
                else:
                    data[k] = v
            for d in del_keys:
                del(data[d])
            if isinstance(data, dict):
                data.update(new_data)
                data.update(keep_data)
            return data
    def search(self, series):
        if TraktSearchTypes.text != self.config['search_type']:
            url = '/search/%s/%s?type=%s&extended=full&limit=100' % (self.config['search_type'], series,
                                                                     ','.join(self.config['result_types']))
        else:
            url = '/search/%s?query=%s&extended=full&limit=100' % (','.join(self.config['result_types']), series)
        filtered = []
        kwargs = {}
        if None is not self.config['sleep_retry']:
            kwargs['sleep_retry'] = self.config['sleep_retry']
        try:
            from sickbeard.helpers import clean_data
            resp = TraktAPI().trakt_request(url, **kwargs)
            if len(resp):
                for d in resp:
                    if isinstance(d, dict) and 'type' in d and d['type'] in self.config['result_types']:
                        for k, v in d.iteritems():
                            d[k] = clean_data(v)
                        if 'show' in d and TraktResultTypes.show == d['type']:
                            d.update(d['show'])
                            del d['show']
                            d['seriesname'] = self._dict_prevent_none(d, 'title', '')
                            d['genres_list'] = d.get('genres', [])
                            d['genres'] = ', '.join(['%s' % v for v in d.get('genres', []) or [] if v])
                            d['firstaired'] = (d.get('first_aired') and
                                               re.sub(r'T.*$', '', str(d.get('first_aired'))) or d.get('year'))
                        filtered.append(d)
        except TraktException as e:
            log().debug('Could not connect to Trakt service: %s' % ex(e))

        return filtered
Beispiel #4
0
    def get_episode_data(self, epid):
        # Parse episode information
        data = None
        log().debug('Getting all episode data for %s' % epid)
        url = self.config['url_episodeInfo'] % epid
        episode_data = self._getetsrc(url, language=self.config['language'])

        if episode_data and 'data' in episode_data:
            data = episode_data['data']
            if isinstance(data, dict):
                for k, v in data.iteritems():
                    k = k.lower()

                    if None is not v:
                        if 'filename' == k and v:
                            v = self.config['url_artworkPrefix'] % v
                        else:
                            v = clean_data(v)
                    data[k] = v

        return data
Beispiel #5
0
    def get_episode_data(self, epid):
        # Parse episode information
        data = None
        log().debug('Getting all episode data for %s' % epid)
        url = self.config['url_episodeInfo'] % epid
        episode_data = self._getetsrc(url, language=self.config['language'])

        if episode_data and 'data' in episode_data:
            data = episode_data['data']
            if isinstance(data, dict):
                for k, v in data.iteritems():
                    k = k.lower()

                    if None is not v:
                        if 'filename' == k and v:
                            v = self.config['url_artworkPrefix'] % v
                        else:
                            v = clean_data(v)
                    data[k] = v

        return data
Beispiel #6
0
    def search(self, series):
        if TraktSearchTypes.text != self.config['search_type']:
            url = '/search/%s/%s?type=%s&extended=full&limit=100' % (
                self.config['search_type'], series, ','.join(
                    self.config['result_types']))
        else:
            url = '/search/%s?query=%s&extended=full&limit=100' % (','.join(
                self.config['result_types']), series)
        filtered = []
        kwargs = {}
        if None is not self.config['sleep_retry']:
            kwargs['sleep_retry'] = self.config['sleep_retry']
        try:
            from sickbeard.helpers import clean_data
            resp = TraktAPI().trakt_request(url, **kwargs)
            if len(resp):
                for d in resp:
                    if isinstance(d, dict) and 'type' in d and d[
                            'type'] in self.config['result_types']:
                        for k, v in iteritems(d):
                            d[k] = clean_data(v)
                        if 'show' in d and TraktResultTypes.show == d['type']:
                            d.update(d['show'])
                            del d['show']
                            d['seriesname'] = self._dict_prevent_none(
                                d, 'title', '')
                            d['genres_list'] = d.get('genres', [])
                            d['genres'] = ', '.join([
                                '%s' % v for v in d.get('genres', []) or []
                                if v
                            ])
                            d['firstaired'] = (d.get('first_aired') and re.sub(
                                r'T.*$', '', str(d.get('first_aired')))
                                               or d.get('year'))
                        filtered.append(d)
        except TraktException as e:
            log.debug('Could not connect to Trakt service: %s' % ex(e))

        return filtered
Beispiel #7
0
    def _get_show_data(self, sid, language, get_ep_info=False):
        """Takes a series ID, gets the epInfo URL and parses the TVDB
        XML file into the shows dict in layout:
        shows[series_id][season_number][episode_number]
        """

        # Parse show information
        log().debug('Getting all series data for %s' % sid)
        url = self.config['url_seriesInfo'] % sid
        show_data = self._getetsrc(url, language=language)

        # check and make sure we have data to process and that it contains a series name
        if not (show_data and 'seriesname' in show_data.get('data', {}) or {}):
            return False

        for k, v in show_data['data'].iteritems():
            self._set_show_data(sid, k, v)

        if sid in self.shows:
            self.shows[sid].ep_loaded = get_ep_info

        p = ''
        if self.config['posters_enabled']:
            poster_data = self._getetsrc(self.config['url_seriesBanner'] %
                                         (sid, 'poster'),
                                         language=language)
            if poster_data and len(poster_data.get('data', '') or '') > 0:
                poster_data['data'] = sorted(
                    poster_data['data'],
                    reverse=True,
                    key=lambda x:
                    (x['ratingsinfo']['average'], x['ratingsinfo']['count']))
                p = self.config['url_artworkPrefix'] % poster_data['data'][0][
                    'filename']
                self._parse_banners(sid, poster_data['data'])
        if p:
            self._set_show_data(sid, u'poster', p)

        b = ''
        if self.config['banners_enabled']:
            poster_data = self._getetsrc(self.config['url_seriesBanner'] %
                                         (sid, 'series'),
                                         language=language)
            if poster_data and len(poster_data.get('data', '') or '') > 0:
                poster_data['data'] = sorted(
                    poster_data['data'],
                    reverse=True,
                    key=lambda x:
                    (x['ratingsinfo']['average'], x['ratingsinfo']['count']))
                b = self.config['url_artworkPrefix'] % poster_data['data'][0][
                    'filename']
                self._parse_banners(sid, poster_data['data'])
        if b:
            self._set_show_data(sid, u'banner', b)

        if self.config['seasons_enabled']:
            poster_data = self._getetsrc(self.config['url_seriesBanner'] %
                                         (sid, 'season'),
                                         language=language)
            if poster_data and len(poster_data.get('data', '') or '') > 0:
                poster_data['data'] = sorted(
                    poster_data['data'],
                    reverse=True,
                    key=lambda x: (-1 * tryInt(x['subkey']), x['ratingsinfo'][
                        'average'], x['ratingsinfo']['count']))
                self._parse_banners(sid, poster_data['data'])

        if self.config['seasonwides_enabled']:
            poster_data = self._getetsrc(self.config['url_seriesBanner'] %
                                         (sid, 'seasonwide'),
                                         language=language)
            if poster_data and len(poster_data.get('data', '') or '') > 0:
                poster_data['data'] = sorted(
                    poster_data['data'],
                    reverse=True,
                    key=lambda x: (-1 * tryInt(x['subkey']), x['ratingsinfo'][
                        'average'], x['ratingsinfo']['count']))
                self._parse_banners(sid, poster_data['data'])

        f = ''
        if self.config['fanart_enabled']:
            fanart_data = self._getetsrc(self.config['url_seriesBanner'] %
                                         (sid, 'fanart'),
                                         language=language)
            if fanart_data and len(fanart_data.get('data', '') or '') > 0:
                fanart_data['data'] = sorted(
                    fanart_data['data'],
                    reverse=True,
                    key=lambda x:
                    (x['ratingsinfo']['average'], x['ratingsinfo']['count']))
                f = self.config['url_artworkPrefix'] % fanart_data['data'][0][
                    'filename']
                self._parse_banners(sid, fanart_data['data'])
        if f:
            self._set_show_data(sid, u'fanart', f)

        if self.config['actors_enabled']:
            actor_data = self._getetsrc(self.config['url_actorsInfo'] % sid,
                                        language=language)
            if actor_data and len(actor_data.get('data', '') or '') > 0:
                self._parse_actors(sid, actor_data['data'])

        if get_ep_info:
            # Parse episode data
            log().debug('Getting all episodes of %s' % sid)

            page = 1
            episodes = []
            while page is not None:
                episode_data = self._getetsrc(self.config['url_epInfo'] %
                                              (sid, page),
                                              language=language)
                if None is episode_data:
                    raise tvdb_error('Exception retrieving episodes for show')
                if not getattr(self, 'not_found',
                               False) and None is not episode_data.get('data'):
                    episodes.extend(episode_data['data'])
                page = episode_data.get('links', {}).get('next', None)

            ep_map_keys = {
                'absolutenumber': u'absolute_number',
                'airedepisodenumber': u'episodenumber',
                'airedseason': u'seasonnumber',
                'airedseasonid': u'seasonid',
                'dvdepisodenumber': u'dvd_episodenumber',
                'dvdseason': u'dvd_season'
            }

            for cur_ep in episodes:
                if self.config['dvdorder']:
                    log().debug('Using DVD ordering.')
                    use_dvd = None is not cur_ep.get(
                        'dvdseason') and None is not cur_ep.get(
                            'dvdepisodenumber')
                else:
                    use_dvd = False

                if use_dvd:
                    elem_seasnum, elem_epno = cur_ep.get(
                        'dvdseason'), cur_ep.get('dvdepisodenumber')
                else:
                    elem_seasnum, elem_epno = cur_ep.get(
                        'airedseason'), cur_ep.get('airedepisodenumber')

                if None is elem_seasnum or None is elem_epno:
                    log().warning(
                        'An episode has incomplete season/episode number (season: %r, episode: %r)'
                        % (elem_seasnum, elem_epno))
                    continue  # Skip to next episode

                # float() is because https://github.com/dbr/tvnamer/issues/95 - should probably be fixed in TVDB data
                seas_no = int(float(elem_seasnum))
                ep_no = int(float(elem_epno))

                for k, v in cur_ep.iteritems():
                    k = k.lower()

                    if None is not v:
                        if 'filename' == k:
                            v = self.config['url_artworkPrefix'] % v
                        else:
                            v = clean_data(v)

                    if k in ep_map_keys:
                        k = ep_map_keys[k]
                    self._set_item(sid, seas_no, ep_no, k, v)

        return True
Beispiel #8
0
    def _get_show_data(self, sid, language, get_ep_info=False):
        """Takes a series ID, gets the epInfo URL and parses the TVDB
        XML file into the shows dict in layout:
        shows[series_id][season_number][episode_number]
        """

        # Parse show information
        log().debug('Getting all series data for %s' % sid)
        url = self.config['url_seriesInfo'] % sid
        show_data = self._getetsrc(url, language=language)

        # check and make sure we have data to process and that it contains a series name
        if not (show_data and 'seriesname' in show_data.get('data', {}) or {}):
            return False

        for k, v in show_data['data'].iteritems():
            self._set_show_data(sid, k, v)

        if sid in self.shows:
            self.shows[sid].ep_loaded = get_ep_info

        p = ''
        if self.config['posters_enabled']:
            poster_data = self._getetsrc(self.config['url_seriesBanner'] % (sid, 'poster'), language=language)
            if poster_data and len(poster_data.get('data', '') or '') > 0:
                poster_data['data'] = sorted(poster_data['data'], reverse=True,
                                             key=lambda x: (x['ratingsinfo']['average'], x['ratingsinfo']['count']))
                p = self.config['url_artworkPrefix'] % poster_data['data'][0]['filename']
                self._parse_banners(sid, poster_data['data'])
        if p:
            self._set_show_data(sid, u'poster', p)

        b = ''
        if self.config['banners_enabled']:
            poster_data = self._getetsrc(self.config['url_seriesBanner'] % (sid, 'series'), language=language)
            if poster_data and len(poster_data.get('data', '') or '') > 0:
                poster_data['data'] = sorted(poster_data['data'], reverse=True,
                                             key=lambda x: (x['ratingsinfo']['average'], x['ratingsinfo']['count']))
                b = self.config['url_artworkPrefix'] % poster_data['data'][0]['filename']
                self._parse_banners(sid, poster_data['data'])
        if b:
            self._set_show_data(sid, u'banner', b)

        if self.config['seasons_enabled']:
            poster_data = self._getetsrc(self.config['url_seriesBanner'] % (sid, 'season'), language=language)
            if poster_data and len(poster_data.get('data', '') or '') > 0:
                poster_data['data'] = sorted(poster_data['data'], reverse=True,
                                             key=lambda x: (-1 * tryInt(x['subkey']), x['ratingsinfo']['average'], x['ratingsinfo']['count']))
                self._parse_banners(sid, poster_data['data'])

        if self.config['seasonwides_enabled']:
            poster_data = self._getetsrc(self.config['url_seriesBanner'] % (sid, 'seasonwide'), language=language)
            if poster_data and len(poster_data.get('data', '') or '') > 0:
                poster_data['data'] = sorted(poster_data['data'], reverse=True,
                                             key=lambda x: (-1 * tryInt(x['subkey']), x['ratingsinfo']['average'], x['ratingsinfo']['count']))
                self._parse_banners(sid, poster_data['data'])

        f = ''
        if self.config['fanart_enabled']:
            fanart_data = self._getetsrc(self.config['url_seriesBanner'] % (sid, 'fanart'), language=language)
            if fanart_data and len(fanart_data.get('data', '') or '') > 0:
                fanart_data['data'] = sorted(fanart_data['data'], reverse=True,
                                             key=lambda x: (x['ratingsinfo']['average'], x['ratingsinfo']['count']))
                f = self.config['url_artworkPrefix'] % fanart_data['data'][0]['filename']
                self._parse_banners(sid, fanart_data['data'])
        if f:
            self._set_show_data(sid, u'fanart', f)

        if self.config['actors_enabled']:
            actor_data = self._getetsrc(self.config['url_actorsInfo'] % sid, language=language)
            if actor_data and len(actor_data.get('data', '') or '') > 0:
                self._parse_actors(sid, actor_data['data'])

        if get_ep_info:
            # Parse episode data
            log().debug('Getting all episodes of %s' % sid)

            page = 1
            episodes = []
            while page is not None:
                episode_data = self._getetsrc(self.config['url_epInfo'] % (sid, page), language=language)
                if None is episode_data:
                    raise tvdb_error('Exception retrieving episodes for show')
                if not getattr(self, 'not_found', False) and None is not episode_data.get('data'):
                    episodes.extend(episode_data['data'])
                page = episode_data.get('links', {}).get('next', None)

            ep_map_keys = {'absolutenumber': u'absolute_number', 'airedepisodenumber': u'episodenumber',
                           'airedseason': u'seasonnumber', 'airedseasonid': u'seasonid',
                           'dvdepisodenumber': u'dvd_episodenumber', 'dvdseason': u'dvd_season'}

            for cur_ep in episodes:
                if self.config['dvdorder']:
                    log().debug('Using DVD ordering.')
                    use_dvd = None is not cur_ep.get('dvdseason') and None is not cur_ep.get('dvdepisodenumber')
                else:
                    use_dvd = False

                if use_dvd:
                    elem_seasnum, elem_epno = cur_ep.get('dvdseason'), cur_ep.get('dvdepisodenumber')
                else:
                    elem_seasnum, elem_epno = cur_ep.get('airedseason'), cur_ep.get('airedepisodenumber')

                if None is elem_seasnum or None is elem_epno:
                    log().warning('An episode has incomplete season/episode number (season: %r, episode: %r)' % (
                        elem_seasnum, elem_epno))
                    continue  # Skip to next episode

                # float() is because https://github.com/dbr/tvnamer/issues/95 - should probably be fixed in TVDB data
                seas_no = int(float(elem_seasnum))
                ep_no = int(float(elem_epno))

                for k, v in cur_ep.iteritems():
                    k = k.lower()

                    if None is not v:
                        if 'filename' == k:
                            v = self.config['url_artworkPrefix'] % v
                        else:
                            v = clean_data(v)

                    if k in ep_map_keys:
                        k = ep_map_keys[k]
                    self._set_item(sid, seas_no, ep_no, k, v)

        return True