def showYears(self, year=None, page=None): if year is None: current_year = int( tools.datetime_workaround( datetime.datetime.today().strftime('%Y-%m-%d')).year) all_years = reversed( [year for year in range(1900, current_year + 1)]) menu_items = [] for year in all_years: menu_items.append( tools.addDirectoryItem(str(year), 'showYears&actionArgs=%s' % year, bulk_add=True)) tools.addMenuItems(syshandle, menu_items, len(menu_items)) tools.closeDirectory('tvshows') else: if page is None: page = 1 trakt_list = trakt.json_response('shows/popular?years=%s&page=%s' % (year, page)) self.showListBuilder(trakt_list) tools.addDirectoryItem( tools.lang(32019), 'showYears&actionArgs=%s&page=%s' % (year, int(page) + 1)) tools.closeDirectory('tvshows')
def onDeckShows(self): hidden_shows = hidden_database.get_hidden_items( 'progress_watched', 'shows') trakt_list = trakt.json_response('sync/playback/episodes', limit=True) if trakt_list is None: return trakt_list = [ i for i in trakt_list if i['show']['ids']['trakt'] not in hidden_shows ] trakt_list = sorted( trakt_list, key=lambda i: tools.datetime_workaround(i['paused_at'][:19], format="%Y-%m-%dT%H:%M:%S", date_only=False), reverse=True) filter_list = [] showList = [] sort_list = [] for i in trakt_list: if i['show']['ids']['trakt'] not in filter_list: if int(i['progress']) != 0: showList.append(i) filter_list.append(i['show']['ids']['trakt']) sort_list.append(i['show']['ids']['trakt']) sort = {'type': 'showInfo', 'id_list': sort_list} self.mixedEpisodeBuilder(showList, sort=sort) tools.closeDirectory('tvshows')
def myNextUp(self, ): hidden_shows = trakt.get_trakt_hidden_items('watched')['shows'] self.threadList = [] watched = trakt.json_response('users/me/watched/shows?extended=full', limit=False) watched = watched[:200] if watched is None: return watch_list = [] for i in watched: if i is not None: watch_list.append(i) watched = [ i for i in watched if i['show']['ids']['trakt'] not in hidden_shows ] if tools.getSetting('nextup.sort') == '1': watched = sorted(watched, key=lambda i: tools.datetime_workaround( i['last_watched_at'][:19], format="%Y-%m-%dT%H:%M:%S", date_only=False), reverse=True) sort = { 'type': 'showInfo', 'id_list': [i['show']['ids']['trakt'] for i in watched] } else: sort = None for i in watched: self.threadList.append( Thread(target=self.traktProgressWorker, args=(i, ))) self.runThreads() self.threadList = [] next_up = self.itemList self.itemList = [] next_list = [] for i in next_up: try: if i['progress']['next_episode'] is not None: next_list.append(i) except: pass next_list = next_list[:50] build_list = [] for i in next_list: item = { 'show': i['show'], 'episode': i['progress']['next_episode'] } build_list.append(item) self.directToEpisodeBuilder(build_list, sort=sort) tools.closeDirectory('episodes')
def is_aired(self, info): try: try:air_date = info['aired'] except: air_date = info['premiered'] if tools.getSetting('general.datedelay') == 'true': air_date = tools.datetime_workaround(air_date, '%Y-%m-%d', date_only=True) air_date += datetime.timedelta(days=1) else: air_date = tools.datetime_workaround(air_date, '%Y-%m-%d', date_only=True) if air_date > datetime.date.today(): return False else: return True except: # Assume an item is aired if we do not have any information on it return True
def onDeckMovies(self): traktList = trakt.json_response('sync/playback/movies', limit=True) if traktList is None: return traktList = sorted( traktList, key=lambda i: tools.datetime_workaround(i['paused_at'][:10])) movieList = [] filter_list = [] for i in traktList: if i['movie']['ids']['trakt'] not in filter_list: if int(i['progress']) != 0: movieList.append(i) filter_list.append(i['movie']['ids']['trakt']) self.commonListBuilder(movieList) tools.closeDirectory('movies', viewType=self.viewType)
def onDeckMovies(self): traktList = trakt.json_response('sync/playback/movies', limit=True) if traktList is None: return trakt_list = sorted(traktList, key=lambda i: tools.datetime_workaround(i['paused_at'][:19], format="%Y-%m-%dT%H:%M:%S", date_only=False), reverse=True) movie_list = [] filter_list = [] for i in trakt_list: if i['movie']['ids']['trakt'] not in filter_list: if int(i['progress']) != 0: movie_list.append(i) filter_list.append(i['movie']['ids']['trakt']) self.commonListBuilder(movie_list) tools.closeDirectory('movies')
def onDeckShows(self): hidden_shows = trakt.get_trakt_hidden_items('watched')['shows'] traktList = trakt.json_response('sync/playback/episodes?extended=full', limit=True) if traktList is None: return traktList = [ i for i in traktList if i['show']['ids']['trakt'] not in hidden_shows ] traktList = sorted( traktList, key=lambda i: tools.datetime_workaround(i['paused_at'][:19], format="%Y-%m-%dT%H:%M:%S", date_only=False), reverse=True) filter_list = [] showList = [] sort_list = [] for i in traktList: if i['show']['ids']['trakt'] not in filter_list: if int(i['progress']) != 0: showList.append(i) filter_list.append(i['show']['ids']['trakt']) sort_list.append(i['show']['ids']['trakt']) sort = {'type': 'showInfo', 'id_list': sort_list} title_appends = {} for i in showList: title_appends[i['episode']['ids'] ['trakt']] = 'Paused (%s%%)' % int(i['progress']) self.directToEpisodeBuilder(showList, sort=sort, title_appends=title_appends) tools.closeDirectory('tvshows')
def episodeIDToListItem(self, trakt_object, show_meta): response = requests.get( self.base_url + self.season_url % (show_meta['showInfo']['ids']['imdb'], trakt_object['season'])) details = BeautifulSoup(response.text, 'html.parser', parse_only=SoupStrainer( 'div', {'id': 'pagecontent'})) item = {'info': None, 'art': None} art = {} info = {} try: info['episode'] = info['sortepisode'] = int(trakt_object['number']) episode = details.find('div', { 'class': 'list detail eplist' }).find_all('div', recursive=False)[int(trakt_object['number']) - 1] except: return try: info['season'] = info['sortseason'] = trakt_object['season'] except: pass try: info['title'] = info['originaltitle'] = tools.unquote( episode.find('a', { 'itemprop': 'name' }).text.strip()) if info['title'] is None: return None except: pass try: info['rating'] = float( episode.find('span', { 'class': 'ipl-rating-star__rating' }).text.strip()) except: pass try: info['premiered'] = trakt_object['first_aired'] except: info['premiered'] = '' try: aired = episode.find('div', {'class': 'airdate'}).text.strip() aired = aired.split(' ') aired[0] = aired[0].zfill(2) aired = tools.datetime_workaround( '%s %s %s' % (aired[0], aired[1].rstrip('.'), aired[2]), '%d %b %Y') info['aired'] = aired.strftime('%Y-%m-%d') except: info['aired'] = '' pass try: info['year'] = trakt_object['aired'][:4] except: pass try: info['plot'] = episode.find('div', { 'itemprop': 'description' }).text.strip() except: pass try: info['imdbnumber'] = episode.find( 'div', {'class': 'wtw-option-standalone'})['data-tconst'] except: pass try: info['studio'] = show_meta['showInfo']['info'].get('studio') except: pass try: info['mpaa'] = show_meta['showInfo']['info'].get('mpaa') except: pass try: art = show_meta['showInfo']['art'] except: pass try: self.art.update(self.fanartart) art['thumb'] = self._amazon_image_enlarger( episode.find('img', src=True)['src'].strip()) except: art['thumb'] = art['fanart'] pass try: info['tvshowtitle'] = show_meta['showInfo']['info']['tvshowtitle'] except: pass try: info['genre'] = show_meta['showInfo']['info']['genre'] except: pass try: info['duration'] = show_meta['showInfo']['info']['duration'] except: pass try: art['landscape'] = art['thumb'] except: pass info['trailer'] = '' info['mediatype'] = 'episode' item['ids'] = trakt_object['ids'] for id, value in show_meta['showInfo']['ids'].items(): item['ids']['tvshow.{}'.format(id)] = value item['info'] = info item['art'] = art item['cast'] = show_meta['showInfo'].get('cast', []) item['trakt_object'] = {} item['trakt_object']['episodes'] = [trakt_object] item['showInfo'] = show_meta['showInfo'] requirements = ['title', 'season', 'episode'] for i in requirements: if info.get(i, None) is None: return None if i not in info: return None return item pass
def episodeIDToListItem(self, trakt_object, showArgs): if 'showInfo' not in showArgs: show_thread = threading.Thread(target=self.seriesIDToListItem, args=(showArgs, False)) show_thread.daemon = True show_thread.start() url = "episodes/%s" % trakt_object['ids']['tvdb'] response = self.get_request(url)['data'] item = {'info': None, 'art': None} art = {} try: art['thumb'] = self.baseImageUrl + response['filename'] except: pass info = {} try: info['dateadded'] = response['firstAired'] except: pass try: info['episode'] = info['sortepisode'] = int( response['airedEpisodeNumber']) except: pass try: info['season'] = info['sortseason'] = int(response['airedSeason']) except: pass try: info['title'] = info['originaltitle'] = response['episodeName'] except: pass try: info['rating'] = float(response['siteRating']) except: pass try: info['premiered'] = response['firstAired'] except: pass try: info['year'] = int(response['firstAired'][:4]) except: pass try: info['plot'] = response['overview'] except: pass try: info['imdbnumber'] = response['imdbId'] except: pass if 'showInfo' not in showArgs: if show_thread.is_alive(): show_thread.join() if self.show_cursory is False or self.show_cursory is None: return None else: showArgs = {'showInfo': {}} showArgs['showInfo'] = self.show_cursory try: info['mpaa'] = showArgs['showInfo']['info']['mpaa'] except: pass try: art['poster'] = showArgs['showInfo']['art']['poster'] except: pass try: info['castandrole'] = showArgs['showInfo']['info']['castandrole'] except: pass try: info['tvshowtitle'] = showArgs['showInfo']['info']['tvshowtitle'] except: pass try: info['genre'] = showArgs['showInfo']['info']['genre'] except: pass try: info['duration'] = showArgs['showInfo']['info']['duration'] except: pass try: art['landscape'] = art['thumb'] except: pass try: art['fanart'] = showArgs['showInfo']['art']['fanart'] except: pass try: currentDate = datetime.datetime.today().date() airdate = str(response['firstAired']) if airdate == '': info['title'] = '[I][COLOR red]%s[/COLOR][/I]' % info['title'] airdate = tools.datetime_workaround(airdate) if airdate > currentDate: info['title'] = '[I][COLOR red]%s[/COLOR][/I]' % info['title'] except: pass info['trailer'] = '' info['mediatype'] = 'episode' item['ids'] = trakt_object['ids'] item['info'] = info item['art'] = art item['trakt_object'] = {} item['trakt_object']['episodes'] = [trakt_object] item['showInfo'] = showArgs['showInfo'] requirements = ['title', 'season', 'episode'] for i in requirements: if info.get(i, None) == None: return None if i not in info: return None return item
def trakt_movie_to_list_item(self, trakt_object): response = requests.get(self.base_url + self.title_url % trakt_object['ids']['imdb']) details = BeautifulSoup(response.text, 'html.parser') item = {'info': None, 'art': None} # Set Info info = {} try: info['genre'] = [] except: pass try: info['rating'] = float(details.find('div', {'class': 'ratingValue'}).find('span').text) except: pass try: title = details.find('div', {'class': 'title_wrapper'}).find('h1').text title = tools.unquote(title).split('(')[0] info['title'] = info['originaltitle'] = title.encode('utf-8') except: return None try: duration = details.find('div', {'class': 'subtext'}).text duration = duration.split('|')[1].strip(' ') if 'h' in duration: duration = duration.split('h') duration[0] = int(duration[0].strip('h')) * 60 duration[1] = re.findall(r'\d\d', duration[1])[0] duration[1] = int(duration[1]) duration = duration[0] + duration[1] else: duration = int(duration.strip('min')) info['duration'] = duration except: pass try: tag = details.find('div', {'id': 'titleStoryLine'}).find('div', {'class': 'txt-block'}).text tag = tag.split('\n')[2] info['tagline'] = tag.encode('utf-8') except: pass try: aired = details.find('div', {'class': 'subtext'}).find_all('a')[2].text aired = aired.split('(')[0] aired = aired.split(' ') aired[0] = aired[0].zfill(2) aired = tools.datetime_workaround('%s %s %s' % (aired[0], aired[1], aired[2]), '%d %B %Y') info['aired'] = info['premiered'] = aired.strftime('%Y-%m-%d') info['year'] = aired.strftime('%Y') except: pass try: info['plot'] = details.find('div', {'id': 'titleStoryLine'}).find_all('span')[1].text except: pass try: info['imdbnumber'] = trakt_object['ids']['imdb'] except: pass try: info['trailer'] = tools.youtube_url % trakt_object['trailer'].split('v=')[1] except: pass try: info['castandrole'] = [()] except: pass # Begin Scraping Artwork art = {} try: art['poster'] = details.find('div', {'class': 'poster'}).find('img')['src'] except: pass try: art['fanart'] = '' except: pass info['mediatype'] = 'movie' info['mpaa'] = '' # Set Crew/Cast Info # director = None # for person in details['credits']['crew']: # if person.get('job') == 'Director': # director = person.get('name') # # if not director == None: # info['director'] = director # # try: # info['cast'] = [i['name'] for i in details['credits']['cast']] # except: # pass item['ids'] = trakt_object['ids'] item['info'] = info item['art'] = art item['trakt_object'] = {} item['trakt_object']['movies'] = [trakt_object] return item
def showToListItem(self, trakt_object): response = requests.get(self.base_url + self.title_url % trakt_object['ids']['imdb']) details = BeautifulSoup(response.text, 'html.parser', parse_only=SoupStrainer( 'div', {'id': 'pagecontent'})) tvdbID = trakt_object['ids']['tvdb'] if self.fanart_support: self.threads.append( threading.Thread(target=self.getFanartTVShow, args=(tvdbID, ))) [i.start() for i in self.threads] [i.join() for i in self.threads] item = {'info': None, 'art': None} # Set Info info = {} title_wrapper = details.find('div', {'class': 'title_wrapper'}) try: info['genre'] = [ genre.text for genre in title_wrapper.find_all('a', href=True) if 'title?genres=' in genre['href'] ] except: pass try: info['rating'] = float( details.find('div', { 'class': 'ratingValue' }).find('span').text) except: pass try: info['mpaa'] = trakt_object['certification'] except: pass try: info['studio'] = trakt_object['network'] except: pass try: info['tvshowtitle'] = info['originaltitle'] = title_wrapper.find( 'h1').text.strip() except: pass try: duration = details.find('div', { 'class': 'subtext' }).find('time').text.strip() if 'h' in duration: duration = duration.split('h') duration[0] = int(duration[0].strip('h')) * 60 duration[1] = re.findall(r'\d{1,2}', duration[1])[0] duration[1] = int(duration[1]) duration = duration[0] + duration[1] else: duration = int(duration.strip('min')) info['duration'] = duration except: pass title_details = details.find('div', {'id': 'titleDetails'}) try: aired = title_details.find_all('div', {'class': 'txt-block'})[3].text aired = aired.split(':')[1] aired = aired.split('(')[0].strip() aired = aired.split(' ') aired[0] = aired[0].zfill(2) aired = tools.datetime_workaround( '%s %s %s' % (aired[0], aired[1], aired[2]), '%d %B %Y') info['premiered'] = trakt_object['first_aired'] info['year'] = aired.strftime('%Y') except: pass try: info['showaliases'] = [ title_details.find_all( 'div', {'class': 'txt-block'})[4].contents[2].strip() ] except: pass try: info['country'] = \ title_details.find_all('div', {'class': 'txt-block'})[1].contents[3]['href'].strip().split('=')[ 1].upper() except: pass try: info['plot'] = details.find('div', { 'id': 'titleStoryLine' }).find_all('span')[1].text.strip() except: pass try: info['imdbnumber'] = trakt_object['ids']['imdb'] except: pass try: info['trailer'] = tools.youtube_url % trakt_object[ 'trailer'].split('v=')[1] except: pass # Set Crew/Cast Info try: crew_table = details.find('table', {'class': 'cast_list'}) rows = crew_table.find_all('tr') self.cast = [] for row in rows: cells = row.find_all('td') if len(cells) > 1: self.cast.append({ 'name': cells[1].find('a').text.encode('utf-8').strip(), 'role': cells[3].find('a').text.encode('utf-8').strip(), 'thumbnail': self._amazon_image_enlarger(cells[0].find( 'img', src=True).get('loadlate')) }) except: traceback.print_exc() pass try: info['episode_count'] = re.findall( r'(\d{1,3})', details.find('span', { 'class': 'bp_sub_heading' }).text)[0] except: info['episode_count'] = 0 pass try: info['status'] = trakt_object['status'] except: pass try: season_urls = [ i['href'] for i in details.find('div', { 'class': 'seasons-and-year-nav' }).find_all('a', href=True) if 'episodes?season' in i['href'] ] info['season_count'] = len(season_urls) except: traceback.print_exc() info['season_count'] = 0 pass # Begin Scraping Artwork self.art.update(self.fanartart) if not self.tvshows_prefer_fanart: self.art['poster'] = self._amazon_image_enlarger( details.find('div', { 'class': 'poster' }).find('img')['src']) if not self.tvshows_prefer_fanart: self.art['fanart'] = self._amazon_image_enlarger( details.find('div', { 'class': 'mediastrip' }).find('img', src=True).get('loadlate')) requirements = ['country', 'tvshowtitle', 'year', 'season_count'] for i in requirements: if i not in info: return None info['mediatype'] = 'tvshow' item['ids'] = trakt_object['ids'] item['info'] = info item['art'] = self.art item['cast'] = self.cast item['trakt_object'] = {} item['trakt_object']['shows'] = [trakt_object] item['art']['thumb'] = item['art'].get('poster', '') return item
def showSeasonToListItem(self, trakt_object, show_meta): try: item = { 'info': copy.deepcopy(show_meta['info']), 'art': copy.deepcopy(show_meta['art']) } season = trakt_object['number'] tvdbID = trakt_object['ids']['tvdb'] if self.fanart_support: self.threads.append( threading.Thread(target=self.getFanartTVSeason, args=(tvdbID, season))) [i.start() for i in self.threads] [i.join() for i in self.threads] response = requests.get(self.base_url + self.season_url % (show_meta['ids']['imdb'], season)) details = BeautifulSoup(response.text, 'html.parser', parse_only=SoupStrainer( 'div', {'id': 'pagecontent'})) if details is None: return None try: item['info']['studio'] = show_meta['info'].get('studio') except: pass try: item['art']['poster'] = item['art']['thumb'] = self.art.get( 'poster', '') if item['art']['poster'] == '' or item['art']['poster'] is None: item['art']['poster'] = item['art']['thumb'] = show_meta[ 'art']['poster'] except: item['art']['poster'] = item['art']['thumb'] = '' try: episode = details.find('div', { 'class': 'list detail eplist' }).find_all('div', recursive=False)[0] aired = episode.find('div', {'class': 'airdate'}).text.strip() aired = aired.split(' ') aired[0] = aired[0].zfill(2) aired = tools.datetime_workaround( '%s %s %s' % (aired[0], aired[1].rstrip('.'), aired[2]), '%d %b %Y') item['info']['aired'] = aired item['year'] = aired[:4] except: pass try: item['info']['episode_count'] = trakt_object['episode_count'] except: item['info']['episode_count'] = 0 pass try: item['info']['aired_episodes'] = trakt_object['aired_episodes'] except: item['info']['aired_episodes'] = 0 pass try: item['info']['premiered'] = trakt_object['first_aired'] item['info']['aired'] = trakt_object['first_aired'] except: pass try: item['info']['plot'] = item['info']['overview'] = trakt_object[ 'overview'] except: pass try: item['info']['season'] = season except: pass try: item['info']['sortseason'] = season except: pass try: item['info']['season_title'] = trakt_object['title'] except: pass if item['info']['season_title'] == '': import traceback traceback.print_exc() return None self.art.update(self.fanartart) item['info']['mediatype'] = 'season' item['ids'] = trakt_object['ids'] for id, value in show_meta['ids'].items(): item['ids']['tvshow.{}'.format(id)] = value item['trakt_object'] = {} item['trakt_object']['seasons'] = [trakt_object] item['showInfo'] = show_meta item['cast'] = show_meta['cast'] item['art']['thumb'] = item['art'].get('poster', '') except: import traceback traceback.print_exc() return None return item
def _requires_update(new_date, old_date): if tools.datetime_workaround(new_date, tools.trakt_gmt_format, False) > \ tools.datetime_workaround(old_date, '%Y-%m-%dT%H:%M:%S', False): return True else: return False
def parseEpisodeInfo(self, response, traktInfo, showArgs): try: if "status_code" in response: if response["status_code"] == 34: return None try:response['name'] = tools.deaccentString(response['name']) except: pass try: currentDate = datetime.today().date() airdate = str(response['air_date']) airdate = tools.datetime_workaround(airdate) except: pass try: if airdate > currentDate: return except: pass item = {'info': None, 'art': None} art = {} try:art['poster'] = showArgs['seasonInfo']['art']['poster'] except:art['poster'] = showArgs['showInfo']['art']['poster'] try:art['thumb'] = self.thumbPath + response.get('still_path', '') except:pass try:art['landscape'] = showArgs['showInfo']['art']['landscape'] except:pass try:art['fanart'] = showArgs['showInfo']['art']['fanart'] except:pass info = {} try:info['trailer'] = tools.youtube_url % [i for i in response['videos']['results'] if i['site'] == 'YouTube'][0]['key'] except:pass try:info['duration'] = showArgs['showInfo']['info'].get('duration') except:pass try:info['episode'] = response.get('episode_number', '') except:pass try:info['season'] = response.get('season_number', '') except:pass try:info['sortepisode'] = response.get('episode_number', '') except:pass try:info['sortseason'] = response.get('season_number', '') except:pass try:info['genre'] = showArgs['showInfo']['info']['genre'] except:pass try:info['title'] = info['sorttitle'] = info['originaltitle'] = tools.deaccentString(response['name']) except: return None try:info['rating'] = response.get('vote_average', '') except:pass try:info['aired'] = response.get('air_date', '') except: import traceback traceback.print_exc() pass try:info['premiered'] = response.get('air_date', '') except:pass try:info['year'] = int(response.get('air_date', '0000')[:4]) except:pass try:info['tvshowtitle'] = showArgs['showInfo']['info']['tvshowtitle'] except:pass try:info['year'] = response.get('firstAired', '')[:4] except:pass try:info['plot'] = response.get('overview', '') except:pass try:info['imdbnumber'] = showArgs['showInfo']['ids']['imdb'] except:pass try:info['mediatype'] = 'episode' except:pass try:info['mpaa'] = showArgs['showInfo']['info']['mpaa'] except:pass try:info['castandrole'] = [(i['name'],i['character']) for i in response['credits']['cast']] except:pass item['ids'] = traktInfo['ids'] item['info'] = info item['art'] = art item['showInfo'] = showArgs['showInfo'] item['trakt_object'] = {} item['trakt_object']['episodes'] = [traktInfo] return item except: import traceback traceback.print_exc() return None
def episodeListBuilder(self, trakt_list, showInfo, smartPlay=False, hide_unaired=False): self.threadList = [] try: play_list = [] if len(trakt_list) == 0: return for item in trakt_list: # if tools.getSetting('general.metalocation') == '1': if 1 == 1: self.threadList.append(Thread(target=self.tvdbEpisodeWorker, args=(item, showInfo))) else: self.threadList.append(Thread(target=self.tmdbEpisodeWorker, args=(item, showInfo))) self.runThreads() if smartPlay is False and tools.getSetting('trakt.auth') != '': try: traktWatched = trakt.json_response( 'shows/%s/progress/watched' % showInfo['showInfo']['ids']['trakt']) except: pass self.itemList = [x for x in self.itemList if x is not None] try: self.itemList = sorted(self.itemList, key=lambda k: k['info']['episode']) except: pass for item in self.itemList: if hide_unaired: try: currentDate = datetime.datetime.today().date() airdate = item['info']['premiered'] if airdate == '': continue airdate = tools.datetime_workaround(airdate) if airdate > currentDate: continue except: import traceback traceback.print_exc() pass cm = [] if item is None: continue if smartPlay is False and tools.getSetting('trakt.auth') != '': item['info']['playcount'] = 0 try: for season in traktWatched['seasons']: if season['number'] == item['info']['season']: for episode in season['episodes']: if episode['number'] == item['info']['episode'] and episode['completed'] == True: item['info']['playcount'] = 1 except: pass try: args = {'showInfo': {}, 'episodeInfo': {}} if tools.getSetting('smartplay.playlistcreate') == 'true' and smartPlay is False: action = 'smartPlay' playable = False else: playable = True action = 'getSources' args['showInfo'] = showInfo['showInfo'] args['episodeInfo']['info'] = item['info'] args['episodeInfo']['art'] = item['art'] args['episodeInfo']['ids'] = item['ids'] name = item['info']['title'] args = tools.quote(json.dumps(args, sort_keys=True)) except: import traceback traceback.print_exc() continue cm.append((tools.lang(33022).encode('utf-8'), 'PlayMedia(%s?action=getSources&seren_reload=true&actionArgs=%s)' % (sysaddon, args))) cm.append((tools.lang(32066).encode('utf-8'), 'PlayMedia(%s?action=getSources&source_select=true&actionArgs=%s)' % (sysaddon, args))) if tools.getSetting('trakt.auth') != '': cm.append(('Trakt Manager', 'RunPlugin(%s?action=traktManager&actionArgs=%s)' % (sysaddon, tools.quote(json.dumps(item['trakt_object']))))) if tools.context_addon(): cm = [] if tools.getSetting('premiumize.enabled') == 'true' and tools.getSetting('premiumize.pin') != '': cm.append((tools.lang(32068).encode('utf-8'), 'XBMC.RunPlugin(%s?action=filePicker&actionArgs=%s)' % (sysaddon, args))) if smartPlay is False: tools.addDirectoryItem(name, action, item['info'], item['art'], cm=cm, isFolder=False, isPlayable=playable, actionArgs=args, set_ids=item['ids']) else: play_list.append(tools.addDirectoryItem(name, action, item['info'], item['art'], isFolder=False, isPlayable=playable, actionArgs=args, smart_play=True, set_ids=item['ids'])) if smartPlay is True: return play_list except: import traceback traceback.print_exc()
def mixedEpisodeBuilder(self, trakt_list, sort=None, hide_watched=False, smartPlay=False, hide_unaired=True, prepend_date=False): self.threadList = [] try: if len(trakt_list) == 0: return self.itemList = TraktSyncDatabase().get_episode_list(trakt_list) self.itemList = [ x for x in self.itemList if x is not None and 'info' in x ] self.itemList = [ i for i in self.itemList if 'info' in i and i['info'].get('premiered', None) is not None ] if sort is None: self.itemList = sorted( self.itemList, key=lambda i: tools.datetime_workaround( i['info']['premiered'], tools.trakt_gmt_format, False), reverse=True) elif sort is not False: sort_list = [] for trakt_id in sort['id_list']: try: if not sort['type']: item = [ i for i in self.itemList if i['ids']['trakt'] == trakt_id ][0] else: item = [ i for i in self.itemList if i[sort['type']]['ids']['trakt'] == trakt_id ][0] sort_list.append(item) except IndexError: continue except: import traceback traceback.print_exc() self.itemList = sort_list item_list = [] for item in self.itemList: if item is None: continue if item['info'].get('title', '') == '': continue if hide_watched and item['info']['playcount'] != 0: continue cm = [] try: name = tools.display_string(item['info']['title']) if not self.is_aired( item['info']) and hide_unaired is True: continue elif not self.is_aired(item['info']): name = tools.colorString(name, 'red') name = tools.italic_string(name) item['info']['title'] = name item['info'] = tools.clean_air_dates(item['info']) args = {'showInfo': {}, 'episodeInfo': {}} if tools.getSetting('smartplay.playlistcreate' ) == 'true' and not smartPlay: action = 'smartPlay' playable = False else: playable = True action = 'getSources' args['showInfo'] = item['showInfo'] args['episodeInfo']['info'] = item['info'] args['episodeInfo']['art'] = item['art'] args['episodeInfo']['ids'] = item['ids'] if self.title_appends == 'true': name = "%s: %sx%s %s" % ( tools.colorString( args['showInfo']['info']['tvshowtitle']), tools.display_string( item['info']['season']).zfill(2), tools.display_string( item['info']['episode']).zfill(2), tools.display_string(item['info']['title'])) if prepend_date: release_day = tools.datetime_workaround( item['info']['aired']) release_day = release_day.strftime('%d %b') name = '[%s] %s' % (release_day, name) args = tools.quote(json.dumps(args, sort_keys=True)) cm.append((tools.lang( 32069 ), 'XBMC.Container.Update(%s?action=showSeasons&actionArgs=%s)' % (sysaddon, tools.quote(json.dumps(str( item['showInfo'])))))) cm.append((tools.lang( 32066 ), 'PlayMedia(%s?action=getSources&source_select=true&actionArgs=%s)' % (sysaddon, args))) cm.append((tools.lang( 33022 ), 'PlayMedia(%s?action=getSources&seren_reload=true&actionArgs=%s)' % (sysaddon, args))) if tools.getSetting('trakt.auth') != '': cm.append(( 'Trakt Manager', 'RunPlugin(%s?action=traktManager&actionArgs=%s)' % (sysaddon, tools.quote(json.dumps(str( item['trakt_object'])))))) if tools.context_addon(): cm = [] if tools.getSetting( 'premiumize.enabled' ) == 'true' and tools.getSetting('premiumize.pin') != '': cm.append((tools.lang( 32068 ), 'XBMC.RunPlugin(%s?action=filePicker&actionArgs=%s)' % (sysaddon, args))) item['info']['title'] = item['info'][ 'originaltitle'] = name item_list.append( tools.addDirectoryItem(name, action, item['info'], item['art'], isFolder=False, isPlayable=playable, actionArgs=args, bulk_add=True, set_ids=item['ids'], cm=cm)) except: import traceback traceback.print_exc() continue if smartPlay is True: return item_list else: tools.addMenuItems(syshandle, item_list, len(item_list)) except: import traceback traceback.print_exc()
def seasonIDToListItem(self, seasonObject, showArgs): try: arb = seasonObject['number'] item = {'info': showArgs['info'], 'art': showArgs['art']} tvdbID = showArgs['ids']['tvdb'] season = seasonObject['number'] self.threads.append( threading.Thread(target=self.getSeasonInfo, args=(tvdbID, season))) self.threads.append( threading.Thread(target=self.getSeasonPoster, args=(tvdbID, season))) for i in self.threads: i.start() for i in self.threads: i.join() details = self.info if details == None: return None try: item['art']['poster'] = item['art']['thumb'] = self.art[ 'poster'] except: item['art']['poster'] = item['art']['thumb'] = '' try: item['info']['year'] = int( details.get('firstAired', '0000')[:4]) except: pass try: item['info']['aired'] = seasonObject['first_aired'][:10] except: pass try: item['info']['date'] = seasonObject['first_aired'][:10] except: pass try: item['info']['premiered'] = seasonObject['first_aired'][:10] except: pass try: item['info']['dateadded'] = seasonObject['first_aired'][:10] except: pass try: item['info']['plot'] = item['info']['overview'] = seasonObject[ 'overview'] except: pass try: item['info']['season'] = season except: pass try: item['info']['sortseason'] = season except: pass try: item['info']['season_title'] = seasonObject['title'] except: pass try: item['info']['castandrole'] = showArgs['info']['castandrole'] except: pass if item['info']['season_title'] == '': return None try: if seasonObject['first_aired'] is None: pass else: currentDate = datetime.datetime.today().date() airdate = str(seasonObject['first_aired'][:10]) airdate = tools.datetime_workaround(airdate) if airdate > currentDate: item['info'][ 'season_title'] = '[I][COLOR red]%s[/COLOR][/I]' % item[ 'info']['season_title'] except: return None pass item['info']['mediatype'] = 'season' item['ids'] = seasonObject['ids'] item['trakt_object'] = {} item['trakt_object']['seasons'] = [seasonObject] item['showInfo'] = showArgs except: return None return item
def __init__(self, xml_file, location, actionArgs=None): try: super(BaseWindow, self).__init__(xml_file, location) except: tools.xmlWindow().__init__() tools.closeBusyDialog() self.canceled = False self.setProperty('texture.white', os.path.join(tools.IMAGES_PATH, 'white.png')) self.setProperty('seren.logo', tools.SEREN_LOGO_PATH) self.setProperty('seren.fanart', tools.SEREN_FANART_PATH) self.setProperty('settings.color', tools.get_user_text_color()) self.setProperty('test_pattern', os.path.join(tools.IMAGES_PATH, 'test_pattern.png')) self.setProperty('skin.dir', SkinManager().confirm_skin_path(xml_file)[1]) if actionArgs is None: return self.item_information = tools.get_item_information(actionArgs) for id, value in self.item_information['ids'].items(): self.setProperty('item.ids.%s_id' % id, str(value)) for i in self.item_information['art'].keys(): self.setProperty('item.art.%s' % i, str(self.item_information['art'][i])) self.item_information['info'] = tools.clean_air_dates( self.item_information['info']) year, month, day = self.item_information['info'].get( 'aired', '0000-00-00').split('-') self.setProperty('item.info.aired.year', year) self.setProperty('item.info.aired.month', month) self.setProperty('item.info.aired.day', day) try: if 'aired' in self.item_information['info']: aired_date = self.item_information['info']['aired'] aired_date = tools.datetime_workaround(aired_date) aired_date = aired_date.strftime(tools.get_region('dateshort')) self.item_information['info']['aired'] = aired_date if 'premiered' in self.item_information['info']: premiered = self.item_information['info']['premiered'] premiered = tools.datetime_workaround(premiered) premiered = premiered.strftime(tools.get_region('dateshort')) self.item_information['info']['premiered'] = premiered except: pass for i in self.item_information['info'].keys(): value = self.item_information['info'][i] if i == 'aired' or i == 'premiered': try: value = value[:10] except: value = 'TBA' if i == 'duration': try: hours = int(value) % 60 self.setProperty('item.info.%s.minutes' % i, str(int(value) - (hours * 60))) self.setProperty('item.info.%s.hours' % i, str(hours)) except: pass try: self.setProperty('item.info.%s' % i, str(value)) except UnicodeEncodeError: self.setProperty('item.info.%s' % i, value)
def mixedEpisodeBuilder(self, trakt_list, sort=None, hide_watched=False, smartPlay=False, hide_unaired=True, prepend_date=False): try: if len(trakt_list) == 0: tools.log('We received no titles to build a list', 'error') return self.itemList = trakt_database.get_episode_list(trakt_list) self.itemList = [x for x in self.itemList if x is not None and 'info' in x] self.itemList = [i for i in self.itemList if 'info' in i and i['info'].get('premiered', None) is not None] self.itemList = [i for i in self.itemList if 'info' in i and i['info'].get('premiered', '') is not ''] if sort is None: self.itemList = sorted(self.itemList, key=lambda i: tools.datetime_workaround(i['info']['premiered'], tools.trakt_gmt_format, False), reverse=True) elif sort is not False: sort_list = [] for trakt_id in sort['id_list']: try: if not sort['type']: item = [i for i in self.itemList if i['ids']['trakt'] == trakt_id][0] else: item = [i for i in self.itemList if i[sort['type']]['ids']['trakt'] == trakt_id][0] sort_list.append(item) except IndexError: continue except: import traceback traceback.print_exc() self.itemList = sort_list item_list = [] for item in self.itemList: if item is None: continue if item['info'].get('title', '') == '': continue if hide_watched and item['info']['playcount'] != 0: continue try: name = tools.display_string(item['info']['title']) if not self.is_aired(item['info']) and hide_unaired is True: continue elif not self.is_aired(item['info']): name = tools.colorString(name, 'red') name = tools.italic_string(name) item['info']['title'] = name item['info'] = tools.clean_air_dates(item['info']) args = {'trakt_id': item['showInfo']['ids']['trakt'], 'season': item['info']['season'], 'episode': item['info']['episode'], 'item_type': 'episode'} args = tools.quote(json.dumps(args, sort_keys=True)) if self.title_appends == 'true': name = "%s: %sx%s %s" % (tools.colorString(item['showInfo']['info']['tvshowtitle']), tools.display_string(item['info']['season']).zfill(2), tools.display_string(item['info']['episode']).zfill(2), tools.display_string(item['info']['title'])) if prepend_date: release_day = tools.datetime_workaround(item['info']['aired']) if release_day: release_day = release_day.strftime('%d %b') name = '[%s] %s' % (release_day, name) item['info']['title'] = item['info']['originaltitle'] = name if 'trakt' in item['ids']: try: bookmark = bookmark_sync.get_bookmark(item['ids']['trakt']) item['info']['resumetime'] = bookmark['timeInSeconds'] if bookmark is not None else 0 item['info']['totaltime'] = item['info']['duration'] except: pass item_list.append(tools.addDirectoryItem(name, 'getSources', item['info'], item['art'], item['cast'], isFolder=False, isPlayable=True, actionArgs=args, bulk_add=True, set_ids=item['ids'])) except: import traceback traceback.print_exc() continue if smartPlay is True: return item_list else: tools.addMenuItems(syshandle, item_list, len(item_list)) except: import traceback traceback.print_exc()
def showSeasonToListItem(self, seasonObject, showArgs): try: self.art = copy.deepcopy(showArgs['art']) item = {'info': copy.deepcopy(showArgs['info'])} url = 'tv/%s/season/%s?&append_to_response=credits,videos,images&language=en-US' % ( str(showArgs['ids']['tmdb']), str(seasonObject['number'])) self.get_TMDB_Fanart_Threaded(url, (showArgs['ids']['tvdb'], 'season')) details = self.request_response if details is None: return None try: currentDate = datetime.today().date() airdate = str(details['air_date']) airdate = tools.datetime_workaround(airdate) if airdate > currentDate: return except: pass try: if self.season_poster == 'true': self.art['poster'] = self.posterPath + str( details.get('poster_path', '')) self.art['thumb'] = self.posterPath + str( details.get('poster_path', '')) except: pass try: count = 0 for i in details['images']['posters'][:self. tvshows_poster_limit]: self.art.update({ 'poster{}'.format(count if count > 0 else ''): self.backgroundPath + i['file_path'] }) count = count + 1 except: pass if self.tvshows_prefer_fanart: try: if self.season_poster == 'true': self.art['poster'] = self.fanartart.get( 'poster', self.posterPath + str(details.get('poster_path', ''))) self.art['thumb'] = self.fanartart.get( 'thumb', self.posterPath + str(details.get('poster_path', ''))) except: pass try: count = 0 for i in details['images'][ 'posters'][:self.tvshows_poster_limit]: dict_name = 'poster{}'.format( count if count > 0 else '') self.art.update({ dict_name: self.fanartart.get( dict_name, self.backgroundPath + i['file_path']) }) count = count + 1 except: pass try: item['info']['plot'] = item['info']['plotoutline'] = item['info']['overview'] = \ details.get('overview', '') if item['info']['plot'] == '': item['info']['plot'] = item['info']['plotoutline'] = item['info']['overview'] = \ seasonObject['overview'] except: pass try: item['info']['aired'] = item['info'][ 'premiered'] = details.get('air_date', '') if item['info']['premiered'] == '': item['info']['aired'] = item['info'][ 'premiered'] = seasonObject['first_aired'] except: pass try: item['info']['year'] = int(details.get('air_date', '0000')[:4]) except: pass try: item['info']['season'] = item['info']['sortseason'] = int( details.get('season_number', '')) except: pass try: item['info']['season_title'] = seasonObject.get('title', '') if item['info']['season_title'] == '': item['info']['season_title'] = details.get('name', '') if item['info']['season_title'] == '': item['info']['season_title'] = 'Season {}'.format( details['season_number']) except: pass try: item['info']['trailer'] = tools.youtube_url % \ [i for i in details['videos']['results'] if i['site'] == 'YouTube'][0]['key'] except: pass try: item['info']['episode_count'] = len(details['episodes']) except: pass try: item['info']['aired_episodes'] = seasonObject['aired_episodes'] except: item['info']['aired_episodes'] = 0 pass if item['info']['season_title'] == '': return None director = None for person in details['credits']['crew']: if person.get('job') == 'Director': director = person.get('name') if not director is None: item['info']['director'] = director try: item['cast'] = [{ 'name': i['name'], 'role': i['character'], 'thumbnail': '{}{}'.format(self.backgroundPath, i['profile_path']) } for i in details['credits']['cast']] except: pass item['info']['mediatype'] = 'season' item['ids'] = seasonObject['ids'] for id, value in showArgs['ids'].items(): item['ids']['tvshow.{}'.format(id)] = value item['trakt_object'] = {} item['trakt_object']['seasons'] = [seasonObject] item['art'] = self.art item['info']['mediatype'] = 'season' item['showInfo'] = showArgs item['art']['thumb'] = item['art'].get('poster', '') except: import traceback traceback.print_exc() return None return item
def directToEpisodeBuilder(self, trakt_list, sort=None): self.threadList = [] traktWatched = trakt.json_response('sync/watched/shows') try: if len(trakt_list) == 0: return for item in trakt_list: # if tools.getSetting('general.metalocation') == '1': if 1 == 1: self.threadList.append(Thread(target=self.tvdbEpisodeWorker, args=(item['episode'], item['show']))) else: self.threadList.append(Thread(target=self.tmdbEpisodeWorker, args=(item[0], item[1]))) self.runThreads() self.itemList = [i for i in self.itemList if i is not None] if sort is not None: sorted_list = [] for sort_id in sort['id_list']: for menu_item in self.itemList: if menu_item[sort['type']]['ids']['trakt'] == sort_id: sorted_list.append(menu_item) self.itemList = sorted_list else: self.itemList = sorted(self.itemList, key=lambda i: tools.datetime_workaround(i['info']['premiered']), reverse=True) for item in self.itemList: if item is None: continue try: currentDate = datetime.datetime.today().date() airdate = item['info']['premiered'] if airdate == '': continue airdate = tools.datetime_workaround(airdate) if airdate > currentDate: continue except: import traceback traceback.print_exc() pass if item['info'].get('title', '') == '': continue cm = [] action = '' if tools.getSetting('trakt.auth') != '': try: item['info']['playcount'] = 0 for show in traktWatched: if str(show['show']['ids']['trakt']) == str(item['showInfo']['ids']['trakt']): for season in show['seasons']: if str(season['number']) == str(item['info']['season']): for episode in season['episodes']: if str(episode['number']) == str(item['info']['episode']): if episode['plays'] > 0: item['info']['playcount'] = 1 except: pass try: args = {'showInfo': {}, 'episodeInfo': {}} if tools.getSetting('smartplay.playlistcreate') == 'true': action = 'smartPlay' playable = False else: playable = True action = 'getSources' args['showInfo'] = item['showInfo'] args['episodeInfo']['info'] = item['info'] args['episodeInfo']['art'] = item['art'] args['episodeInfo']['ids'] = item['ids'] name = item['info']['title'] if self.title_appends == 'true': name = "%s: %sx%s %s" % (tools.colorString(args['showInfo']['info']['tvshowtitle']), str(item['info']['season']).zfill(2), str(item['info']['episode']).zfill(2), item['info']['title'].encode('utf-8')) args = tools.quote(json.dumps(args, sort_keys=True)) item['info']['title'] = item['info']['originaltitle'] = name cm.append((tools.lang(32069).encode('utf-8'), 'XBMC.Container.Update(%s?action=showSeasons&actionArgs=%s)' % (sysaddon, tools.quote(json.dumps(item['showInfo']))))) cm.append((tools.lang(32066).encode('utf-8'), 'PlayMedia(%s?action=getSources&source_select=true&actionArgs=%s)' % (sysaddon, args))) cm.append((tools.lang(33022).encode('utf-8'), 'PlayMedia(%s?action=getSources&seren_reload=true&actionArgs=%s)' % (sysaddon, args))) if tools.getSetting('trakt.auth') != '': cm.append(('Trakt Manager', 'RunPlugin(%s?action=traktManager&actionArgs=%s)' % (sysaddon, tools.quote(json.dumps(item['trakt_object']))))) if tools.context_addon(): cm = [] if tools.getSetting('premiumize.enabled') == 'true' and tools.getSetting('premiumize.pin') != '': cm.append((tools.lang(32068).encode('utf-8'), 'XBMC.RunPlugin(%s?action=filePicker&actionArgs=%s)' % (sysaddon, args))) except: import traceback traceback.print_exc() continue tools.addDirectoryItem(name, action, item['info'], item['art'], cm=cm, isFolder=False, isPlayable=playable, actionArgs=args, set_ids=item['ids']) except: import traceback traceback.print_exc()
def parseEpisodeInfo(self, response, traktInfo, showArgs): try: if "status_code" in response: if response["status_code"] == 34: return None try: response['name'] = tools.deaccentString(response['name']) except: pass try: currentDate = datetime.today().date() airdate = str(response['air_date']) airdate = tools.datetime_workaround(airdate) if airdate > currentDate: return except: pass item = {'info': None, 'art': None} art = copy.deepcopy(showArgs['seasonInfo']['art']) try: if self.episode_fanart == 'true': art.update(self.parseEpisodeFanart(response)) art['landscape'] = self.backgroundPath + response.get( 'still_path', '') art['thumb'] = self.thumbPath + response.get('still_path', '') except: pass info = {} try: info['trailer'] = tools.youtube_url % \ [i for i in response['videos']['results'] if i['site'] == 'YouTube'][0]['key'] except: pass try: info['duration'] = showArgs['showInfo']['info'].get('duration') except: pass try: info['episode'] = response.get('episode_number', '') except: return None try: info['season'] = response.get('season_number', '') except: return None try: info['sortepisode'] = response.get('episode_number', '') except: pass try: info['sortseason'] = response.get('season_number', '') except: pass try: info['genre'] = showArgs['showInfo']['info']['genre'] except: pass try: info['title'] = info['sorttitle'] = info[ 'originaltitle'] = tools.deaccentString(response['name']) except: return None try: info['rating'] = response.get('vote_average', '') except: pass try: info['aired'] = traktInfo['first_aired'] except: import traceback traceback.print_exc() pass try: info['premiered'] = traktInfo['first_aired'] except: pass try: info['year'] = int(response.get('air_date', '0000')[:4]) if info['year'] == '0000': info['year'] = int(traktInfo.get('firstAired', '0000')[:4]) except: pass try: info['tvshowtitle'] = showArgs['showInfo']['info'][ 'tvshowtitle'] except: pass try: info['plot'] = response.get('overview', '') if info['plot'] == '': traktInfo.get('overview', '') except: pass try: info['imdbnumber'] = showArgs['showInfo']['ids']['imdb'] except: pass try: info['mediatype'] = 'episode' except: pass try: info['mpaa'] = showArgs['showInfo']['info']['mpaa'] except: pass try: item['cast'] = [{ 'name': i['name'], 'role': i['character'], 'thumbnail': '{}{}'.format(self.backgroundPath, i['profile_path']) } for i in response['credits']['cast']] except: item['cast'] = [] pass item['ids'] = traktInfo['ids'] for id, value in showArgs['showInfo']['ids'].items(): item['ids']['tvshow.{}'.format(id)] = value item['info'] = info item['art'] = art item['showInfo'] = showArgs['showInfo'] item['trakt_object'] = {} item['trakt_object']['episodes'] = [traktInfo] return item except: import traceback traceback.print_exc() return None
def showSeasonToListItem(self, seasonObject, showArgs): try: item = {'info': showArgs['info'], 'art': showArgs['art']} url = 'tv/%s/season/%s?&append_to_response=credits,videos' % (str(showArgs['ids']['tmdb']), str(seasonObject['number'])) details = self.get_request(url) if details == None: return None try: currentDate = datetime.today().date() airdate = str(details['air_date']) airdate = tools.datetime_workaround(airdate) except: pass try: if airdate > currentDate: return except: pass try:item['art']['poster'] = self.posterPath + str(details.get('poster_path', '')) except:item['art']['poster'] = '' try:item['art']['thumb'] = self.posterPath + details.get('poster_path', ' ') except:item['art']['thumb'] = '' try: if details.get('overview', '') is not '': item['info']['plot'] = item['info']['plotoutline'] = details.get('overview', '') except:pass try:item['info']['aired'] = details.get('air_date', '') except: import traceback traceback.print_exc() pass try:item['info']['premiered'] = details.get('air_date', '') except: import traceback traceback.print_exc() pass try:item['info']['year'] = int(details.get('air_date','0000')[:4]) except:pass try:item['info']['sortseason'] = str(details.get('season_number', '')) except:pass try:item['info']['season'] = str(details.get('season_number', '')) except:pass try:item['info']['season_title'] = str(details.get('name', '')) except:pass try:item['info']['trailer'] = tools.youtube_url % [i for i in details['videos']['results'] if i['site'] == 'YouTube'][0]['key'] except:pass director = None for person in details['credits']['crew']: if person.get('job') == 'Director': director = person.get('name') if not director == None: item['info']['director'] = director try: item['info']['cast'] = [i['name'] for i in details['credits']['cast']] except: pass item['info']['mediatype'] = 'season' item['ids'] = seasonObject['ids'] item['trakt_object'] = {} item['trakt_object']['seasons'] = [seasonObject] except: import traceback traceback.print_exc() return None return item
def _parse_local_date_format(datestring): return tools.datetime_workaround(datestring, tools.trakt_gmt_format.strip('.000Z'), date_only=False)