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
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
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
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
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
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