def action(action, tmdb_id=None, tmdb_type=None, season=None, episode=None, label=None, cache_refresh=False): _traktapi = TraktAPI() if action == 'history': func = _traktapi.sync_history elif action == 'collection': func = _traktapi.sync_collection elif action == 'watchlist': func = _traktapi.sync_watchlist elif action == 'add_to_userlist': return sync_userlist() elif action == 'remove_from_userlist': return sync_userlist(remove_item=True) elif action == 'library_userlist': return library_userlist() elif action == 'library': return library() elif action == 'play': return play() elif action == 'open': return browse() else: return with utils.busy_dialog(): if tmdb_type == 'episode' and (not season or not episode): return elif tmdb_id and tmdb_type: dbtype = utils.type_convert(tmdb_type, 'dbtype') label = label or 'this {}'.format(utils.type_convert(tmdb_type, 'trakt')) else: label = sys.listitem.getLabel() dbtype = sys.listitem.getVideoInfoTag().getMediaType() tmdb_id = sys.listitem.getProperty('tmdb_id') if not dbtype == 'episode' else sys.listitem.getProperty('tvshow.tmdb_id') season = sys.listitem.getVideoInfoTag().getSeason() if dbtype == 'episode' else None episode = sys.listitem.getVideoInfoTag().getEpisode() if dbtype == 'episode' else None tmdb_type = 'movie' if dbtype == 'movie' else 'tv' trakt_ids = func(utils.type_convert(tmdb_type, 'trakt'), 'tmdb', cache_refresh=cache_refresh) boolean = 'remove' if int(tmdb_id) in trakt_ids else 'add' dialog_header = 'Trakt {0}'.format(action.capitalize()) dialog_text = xbmcaddon.Addon().getLocalizedString(32065) if boolean == 'add' else xbmcaddon.Addon().getLocalizedString(32064) dialog_text = dialog_text.format(utils.try_decode_string(label), action.capitalize(), tmdb_type, tmdb_id) dialog_text = dialog_text + ' Season: {} Episode: {}'.format(season, episode) if dbtype == 'episode' else dialog_text if not xbmcgui.Dialog().yesno(dialog_header, dialog_text): return with utils.busy_dialog(): trakt_type = 'episode' if dbtype == 'episode' else utils.type_convert(tmdb_type, 'trakt') slug_type = 'show' if dbtype == 'episode' else trakt_type slug = _traktapi.get_traktslug(slug_type, 'tmdb', tmdb_id) item = _traktapi.get_details(slug_type, slug, season=season, episode=episode) items = {trakt_type + 's': [item]} func(slug_type, mode=boolean, items=items) dialog_header = 'Trakt {0}'.format(action.capitalize()) dialog_text = xbmcaddon.Addon().getLocalizedString(32062) if boolean == 'add' else xbmcaddon.Addon().getLocalizedString(32063) dialog_text = dialog_text.format(tmdb_id, action.capitalize()) xbmcgui.Dialog().ok(dialog_header, dialog_text) xbmc.executebuiltin('Container.Refresh')
def get_collection(self, tmdbtype, page=1, limit=20): items = [] if not self.tmdb or not self.authorize(): return items collection = self.sync_collection(utils.type_convert( tmdbtype, 'trakt')) collection = sorted( collection, key=lambda i: i[utils.type_convert(tmdbtype, 'trakt')]['title'], reverse=False) start_at = limit * (page - 1) end_at = start_at + limit for i in collection[start_at:end_at]: i = i.get(utils.type_convert(tmdbtype, 'trakt')) i_tmdb = i.get('ids', {}).get('tmdb', '') item = ListItem(library=self.library, **self.tmdb.get_detailed_item(tmdbtype, i_tmdb)) if item and item.label != 'N/A': items.append(item) if items and collection[ end_at:]: # If there's more items add the next page item items.append( ListItem(library=self.library, label=xbmc.getLocalizedString(33078), nextpage=page + 1)) return items
def get_limitedlist(self, itemlist, tmdbtype, limit, islistitem): items, added_items = [], [] if not self.tmdb or not self.authorize(): return items n = 0 itemtype = utils.type_convert(tmdbtype, 'trakt') for i in itemlist: if limit and n >= limit: break item = ( i.get(itemtype, {}).get('ids', {}).get('slug'), i.get(itemtype, {}).get('ids', {}).get('tmdb'), i.get(itemtype, {}).get('title')) if item in added_items: continue added_items.append(item) if islistitem: item = ListItem(library=self.library, **self.tmdb.get_detailed_item(tmdbtype, item[1])) items.append(item) n += 1 return items
def get_url(self, url, url_tmdb_id=None, widget=None, fanarttv=None, nextpage=None, extended=None, linklibrary=False): self.url = self.url or url.copy() self.url[ 'tmdb_id'] = self.tmdb_id = url_tmdb_id or self.tmdb_id or self.url.get( 'tmdb_id') if self.url.get( 'info' ) == 'discover': # Special handling of discover url to pass tmdb_id for k, v in self.url.items(): if isinstance(v, str): self.url[k] = v.format(tmdb_id=self.url.get('tmdb_id')) if self.mixed_type: self.url['type'] = self.mixed_type self.infolabels['mediatype'] = utils.type_convert( self.mixed_type, 'dbtype') if self.label == xbmc.getLocalizedString(33078): # Next Page self.infolabels.pop('mediatype', None) if self.infolabels.get('mediatype') in ['season', 'episode']: self.url['season'] = self.infolabels.get('season') self.infoproperties['tvshow.tmdb_id'] = self.url.get('tmdb_id') if self.infolabels.get('mediatype') == 'episode': self.url['episode'] = self.infolabels.get('episode') if fanarttv: self.url['fanarttv'] = fanarttv if nextpage: self.url['nextpage'] = nextpage if widget: self.url['widget'] = widget if not extended and (self.url.get('widget', '').capitalize() == 'True' or self.select_action): if self.infolabels.get('mediatype') in ['movie', 'episode']: self.url['info'] = 'play' elif self.infolabels.get('mediatype') == 'tvshow': self.url['info'] = 'seasons' if self.addon.getSettingBool('flatten_seasons'): self.url['info'] = 'flatseasons' self.url['type'] = 'episode' # Link library for Next Aired if linklibrary and self.infolabels.get( 'mediatype') == 'episode' and self.tvshow_dbid: self.url = { 'url': 'videodb://tvshows/titles/{}/'.format(self.tvshow_dbid) } # Set video paths to url self.is_folder = True if self.infolabels.get('mediatype') == 'video' and self.infolabels.get( 'path') and self.url.get('info') == 'details': self.url = {'url': self.infolabels.get('path')} self.is_folder = False if self.url.get('info') in ['play', 'textviewer', 'imageviewer']: self.is_folder = False
def build_details(self): self.item['id'] = self.tmdb_id self.item['tmdb'] = self.tmdb_id self.item['imdb'] = self.details.get('infolabels', {}).get('imdbnumber') self.item['name'] = u'{0} ({1})'.format(self.item.get('title'), self.item.get('year')) self.item['firstaired'] = self.details.get('infolabels', {}).get('premiered') self.item['premiered'] = self.details.get('infolabels', {}).get('premiered') self.item['released'] = self.details.get('infolabels', {}).get('premiered') self.item['showname'] = self.item.get('title') self.item['clearname'] = self.item.get('title') self.item['tvshowtitle'] = self.item.get('title') self.item['title'] = self.item.get('title') self.item['thumbnail'] = self.details.get('thumb') self.item['poster'] = self.details.get('poster') self.item['fanart'] = self.details.get('fanart') self.item['now'] = datetime.datetime.now().strftime('%Y%m%d%H%M%S%f') if self.traktapi: slug_type = utils.type_convert(self.tmdbtype, 'trakt') trakt_details = self.traktapi.get_details( slug_type, self.traktapi.get_traktslug(slug_type, 'tmdb', self.tmdb_id)) self.item['trakt'] = trakt_details.get('ids', {}).get('trakt') self.item['imdb'] = trakt_details.get('ids', {}).get('imdb') self.item['tvdb'] = trakt_details.get('ids', {}).get('tvdb') self.item['slug'] = trakt_details.get('ids', {}).get('slug') if self.itemtype == 'episode': # Do some special episode stuff self.item['id'] = self.item.get('tvdb') self.item['title'] = self.details.get('infolabels', {}).get( 'title') # Set Episode Title self.item['name'] = u'{0} S{1:02d}E{2:02d}'.format( self.item.get('showname'), int(self.season), int(self.episode)) self.item['season'] = self.season self.item['episode'] = self.episode if self.traktapi and self.itemtype == 'episode': trakt_details = self.traktapi.get_details(slug_type, self.item.get('slug'), season=self.season, episode=self.episode) self.item['epid'] = trakt_details.get('ids', {}).get('tvdb') self.item['epimdb'] = trakt_details.get('ids', {}).get('imdb') self.item['eptmdb'] = trakt_details.get('ids', {}).get('tmdb') self.item['eptrakt'] = trakt_details.get('ids', {}).get('trakt') for k, v in self.item.copy().items(): v = u'{0}'.format(v) self.item[k] = v.replace(',', '') self.item[k + '_+'] = v.replace(' ', '+') self.item[k + '_-'] = v.replace(' ', '-') self.item[k + '_escaped'] = v.replace(' ', '%2520') self.item[k + '_escaped+'] = v.replace(' ', '%252B')
def action(action): _traktapi = TraktAPI() if action == 'history': func = _traktapi.sync_history elif action == 'collection': func = _traktapi.sync_collection elif action == 'watchlist': func = _traktapi.sync_watchlist elif action == 'library': return library() else: return with utils.busy_dialog(): label = sys.listitem.getLabel() dbtype = sys.listitem.getVideoInfoTag().getMediaType() tmdb_id = sys.listitem.getProperty('tmdb_id') tmdb_type = 'movie' if dbtype == 'movie' else 'tv' trakt_ids = func(utils.type_convert(tmdb_type, 'trakt'), 'tmdb') boolean = 'remove' if int(tmdb_id) in trakt_ids else 'add' dialog_header = 'Trakt {0}'.format(action.capitalize()) dialog_text = xbmcaddon.Addon().getLocalizedString(32065) if boolean == 'add' else xbmcaddon.Addon().getLocalizedString(32064) dialog_text = dialog_text.format(label, action.capitalize(), dbtype.capitalize(), tmdb_id) if not xbmcgui.Dialog().yesno(dialog_header, dialog_text): return with utils.busy_dialog(): trakt_type = utils.type_convert(tmdb_type, 'trakt') slug_type = 'show' if dbtype == 'episode' else trakt_type slug = _traktapi.get_traktslug(slug_type, 'tmdb', tmdb_id) season = sys.listitem.getVideoInfoTag().getSeason() if dbtype == 'episode' else None episode = sys.listitem.getVideoInfoTag().getEpisode() if dbtype == 'episode' else None item = _traktapi.get_details(slug_type, slug, season=season, episode=episode) items = {trakt_type + 's': [item]} func(slug_type, mode=boolean, items=items) dialog_header = 'Trakt {0}'.format(action.capitalize()) dialog_text = xbmcaddon.Addon().getLocalizedString(32062) if boolean == 'add' else xbmcaddon.Addon().getLocalizedString(32063) dialog_text = dialog_text.format(tmdb_id, action.capitalize()) xbmcgui.Dialog().ok(dialog_header, dialog_text) xbmc.executebuiltin('Container.Refresh')
def get_ratings(self, tmdbtype=None, imdb_id=None, trakt_id=None, trakt_slug=None, season=None, episode=None): slug = trakt_slug or trakt_id or imdb_id infoproperties = {} if not slug or not tmdbtype: return infoproperties url = 'episodes/{0}/ratings'.format(episode) if episode else 'ratings' url = 'seasons/{0}/{1}'.format(season, url) if season else 'ratings' response = self.get_request_lc(utils.type_convert(tmdbtype, 'trakt') + 's', slug, url) infoproperties['trakt_rating'] = '{:0.1f}'.format(response.get('rating')) if response.get('rating') else '' infoproperties['trakt_votes'] = '{:0,.0f}'.format(response.get('votes')) if response.get('votes') else '' return infoproperties
def set_defaultplayer(self): player = Player() tmdbtype = self.params.get('set_defaultplayer') setting = 'default_player_episodes' if tmdbtype == 'tv' else 'default_player_{0}s'.format(tmdbtype) player.setup_players(tmdbtype=tmdbtype, clearsetting=True, assertplayers=False) idx = xbmcgui.Dialog().select( 'Choose Default Player for {0}'.format(utils.type_convert(tmdbtype, 'plural')), player.itemlist) if idx == 0: self.addon.setSettingString(setting, '') if idx > 0: selected = player.itemlist[idx].getLabel() self.addon.setSettingString(setting, selected)
def build_details(self): self.item['id'] = self.tmdb_id self.item['tmdb'] = self.tmdb_id self.item['imdb'] = self.details.get('infolabels', {}).get('imdbnumber') self.item['name'] = u'{0} ({1})'.format(self.item.get('title'), self.item.get('year')) self.item['premiered'] = self.item['firstaired'] = self.item['released'] = self.details.get('infolabels', {}).get('premiered') self.item['plot'] = self.details.get('infolabels', {}).get('plot') self.item['cast'] = self.item['actors'] = " / ".join([i.get('name') for i in self.details.get('cast', []) if i.get('name')]) self.item['showname'] = self.item['clearname'] = self.item['tvshowtitle'] = self.item['title'] = self.item.get('title') self.item['thumbnail'] = self.details.get('thumb') self.item['poster'] = self.details.get('poster') self.item['fanart'] = self.details.get('fanart') self.item['now'] = datetime.datetime.now().strftime('%Y%m%d%H%M%S%f') if self.traktapi: slug_type = utils.type_convert(self.tmdbtype, 'trakt') trakt_details = self.traktapi.get_details(slug_type, self.traktapi.get_traktslug(slug_type, 'tmdb', self.tmdb_id)) self.item['trakt'] = trakt_details.get('ids', {}).get('trakt') self.item['imdb'] = self.details.get('infoproperties', {}).get('tvshow.imdb_id') or trakt_details.get('ids', {}).get('imdb') self.item['tvdb'] = self.details.get('infoproperties', {}).get('tvshow.tvdb_id') or trakt_details.get('ids', {}).get('tvdb') self.item['slug'] = trakt_details.get('ids', {}).get('slug') if self.itemtype == 'episode': # Do some special episode stuff self.item['id'] = self.item.get('tvdb') self.item['title'] = self.details.get('infolabels', {}).get('title') # Set Episode Title self.item['name'] = u'{0} S{1:02d}E{2:02d}'.format(self.item.get('showname'), int(utils.try_parse_int(self.season)), int(utils.try_parse_int(self.episode))) self.item['season'] = self.season self.item['episode'] = self.episode self.item['showpremiered'] = self.details.get('infoproperties', {}).get('tvshow.premiered') self.item['showyear'] = self.details.get('infoproperties', {}).get('tvshow.year') if self.traktapi and self.itemtype == 'episode': trakt_details = self.traktapi.get_details(slug_type, self.item.get('slug'), season=self.season, episode=self.episode) self.item['epid'] = self.details.get('infoproperties', {}).get('tvdb_id') or trakt_details.get('ids', {}).get('tvdb') self.item['epimdb'] = trakt_details.get('ids', {}).get('imdb') self.item['eptmdb'] = self.details.get('infoproperties', {}).get('tmdb_id') or trakt_details.get('ids', {}).get('tmdb') self.item['eptrakt'] = trakt_details.get('ids', {}).get('trakt') utils.kodi_log(u'Player Details - Item:\n{}'.format(self.item), 2) for k, v in self.item.copy().items(): if k not in constants.PLAYER_URLENCODE: continue v = u'{0}'.format(v) for key, value in {k: v, '{}_meta'.format(k): dumps(v)}.items(): self.item[key] = value.replace(',', '') self.item[key + '_+'] = value.replace(',', '').replace(' ', '+') self.item[key + '_-'] = value.replace(',', '').replace(' ', '-') self.item[key + '_escaped'] = quote(quote(utils.try_encode_string(value))) self.item[key + '_escaped+'] = quote(quote_plus(utils.try_encode_string(value))) self.item[key + '_url'] = quote(utils.try_encode_string(value)) self.item[key + '_url+'] = quote_plus(utils.try_encode_string(value))
def get_mostwatched(self, userslug, tmdbtype, limit=None, islistitem=True, onlyshows=False): extended = 'noseasons' if onlyshows else None history = self.get_response_json( 'users', userslug, 'watched', utils.type_convert(tmdbtype, 'trakt') + 's', extended=extended) history = sorted(history, key=lambda i: i['plays'], reverse=True) return self.get_limitedlist(history, tmdbtype, limit, islistitem)
def get_recentlywatched(self, userslug, tmdbtype, limit=None, islistitem=True, months=6): start_at = datetime.date.today() - datetime.timedelta( months * 365 / 12) history = self.get_response_json( 'users', userslug, 'history', utils.type_convert(tmdbtype, 'trakt') + 's', page=1, limit=200, start_at=start_at.strftime("%Y-%m-%d")) return self.get_limitedlist(history, tmdbtype, limit, islistitem)
def get_url(self, url, url_tmdb_id=None, widget=None, fanarttv=None, nextpage=None, extended=None): self.url = self.url or url.copy() self.url[ 'tmdb_id'] = self.tmdb_id = url_tmdb_id or self.tmdb_id or self.url.get( 'tmdb_id') if self.mixed_type: self.url['type'] = self.mixed_type self.infolabels['mediatype'] = utils.type_convert( self.mixed_type, 'dbtype') if self.label == xbmc.getLocalizedString(33078): # Next Page self.infolabels.pop('mediatype', None) if self.infolabels.get('mediatype') in ['season', 'episode']: self.url['season'] = self.infolabels.get('season') self.infoproperties['tvshow.tmdb_id'] = self.url.get('tmdb_id') if self.infolabels.get('mediatype') == 'episode': self.url['episode'] = self.infolabels.get('episode') if fanarttv: self.url['fanarttv'] = fanarttv if nextpage: self.url['nextpage'] = nextpage if widget: self.url['widget'] = widget if not extended and (self.url.get('widget', '').capitalize() == 'True' or self.select_action): if self.infolabels.get('mediatype') in ['movie', 'episode']: self.url['info'] = 'play' elif self.infolabels.get('mediatype') == 'tvshow': self.url['info'] = 'seasons' if self.addon.getSettingBool('flatten_seasons'): self.url['info'] = 'flatseasons' self.url['type'] = 'episode' # Set video paths to url if self.infolabels.get('mediatype') == 'video' and self.infolabels.get( 'path'): self.url = {'url': self.infolabels.get('path')} self.is_folder = False if self.url.get('info') in [ 'play', 'textviewer', 'imageviewer' ] or self.url.get('url') else True
def build_details(self): self.item['id'] = self.tmdb_id self.item['tmdb'] = self.tmdb_id self.item['imdb'] = self.details.get('infolabels', {}).get('imdbnumber') self.item['name'] = u'{0} ({1})'.format(self.item.get('title'), self.item.get('year')) self.item['firstaired'] = self.details.get('infolabels', {}).get('premiered') self.item['premiered'] = self.details.get('infolabels', {}).get('premiered') self.item['released'] = self.details.get('infolabels', {}).get('premiered') self.item['showname'] = self.item.get('title') self.item['clearname'] = self.item.get('title') self.item['tvshowtitle'] = self.item.get('title') self.item['title'] = self.item.get('title') self.item['thumbnail'] = self.details.get('thumb') self.item['poster'] = self.details.get('poster') self.item['fanart'] = self.details.get('fanart') self.item['now'] = datetime.datetime.now().strftime('%Y%m%d%H%M%S%f') if self.traktapi: slug_type = utils.type_convert(self.tmdbtype, 'trakt') trakt_details = self.traktapi.get_details( slug_type, self.traktapi.get_traktslug(slug_type, 'tmdb', self.tmdb_id)) self.item['trakt'] = trakt_details.get('ids', {}).get('trakt') self.item['imdb'] = self.details.get( 'infoproperties', {}).get('tvshow.imdb_id') or trakt_details.get('ids', {}).get('imdb') self.item['tvdb'] = self.details.get( 'infoproperties', {}).get('tvshow.tvdb_id') or trakt_details.get('ids', {}).get('tvdb') self.item['slug'] = trakt_details.get('ids', {}).get('slug') if self.itemtype == 'episode': # Do some special episode stuff self.item['id'] = self.item.get('tvdb') self.item['title'] = self.details.get('infolabels', {}).get( 'title') # Set Episode Title self.item['name'] = u'{0} S{1:02d}E{2:02d}'.format( self.item.get('showname'), int(utils.try_parse_int(self.season)), int(utils.try_parse_int(self.episode))) self.item['season'] = self.season self.item['episode'] = self.episode if self.traktapi and self.itemtype == 'episode': trakt_details = self.traktapi.get_details(slug_type, self.item.get('slug'), season=self.season, episode=self.episode) self.item['epid'] = self.details.get( 'infoproperties', {}).get('tvdb_id') or trakt_details.get( 'ids', {}).get('tvdb') self.item['epimdb'] = trakt_details.get('ids', {}).get('imdb') self.item['eptmdb'] = self.details.get( 'infoproperties', {}).get('tmdb_id') or trakt_details.get( 'ids', {}).get('tmdb') self.item['eptrakt'] = trakt_details.get('ids', {}).get('trakt') utils.kodi_log(u'Player Details - Item:\n{}'.format(self.item), 2) for k, v in self.item.copy().items(): if k not in [ 'name', 'showname', 'clearname', 'tvshowtitle', 'title', 'thumbnail', 'poster', 'fanart', 'originaltitle' ]: continue v = u'{0}'.format(v) self.item[k] = v.replace(',', '') self.item[k + '_+'] = v.replace(' ', '+') self.item[k + '_-'] = v.replace(' ', '-') self.item[k + '_escaped'] = quote(quote( utils.try_encode_string(v))) self.item[k + '_escaped+'] = quote( quote_plus(utils.try_encode_string(v))) self.item[k + '_url'] = quote(utils.try_encode_string(v)) self.item[k + '_url+'] = quote_plus(utils.try_encode_string(v))
def action(action, tmdb_id=None, tmdb_type=None, season=None, episode=None, label=None): _traktapi = TraktAPI() if action == 'history': func = _traktapi.sync_history elif action == 'collection': func = _traktapi.sync_collection elif action == 'watchlist': func = _traktapi.sync_watchlist elif action == 'add_to_userlist': return sync_userlist() elif action == 'remove_from_userlist': return sync_userlist(remove_item=True) elif action == 'library_userlist': return library_userlist() elif action == 'library': return library() elif action == 'refresh_item': return refresh_item() elif action == 'play': return play() elif action == 'open': return browse() else: return with utils.busy_dialog(): if tmdb_id and tmdb_type: # Passed details via script dbtype = utils.type_convert(tmdb_type, 'dbtype') label = label or 'this {}'.format(utils.type_convert(tmdb_type, 'trakt')) parent_tmdb_id = tmdb_id else: # Context menu so retrieve details from listitem label = sys.listitem.getLabel() dbtype = sys.listitem.getVideoInfoTag().getMediaType() tmdb_id = sys.listitem.getProperty('tmdb_id') parent_tmdb_id = sys.listitem.getProperty('tvshow.tmdb_id') if dbtype == 'episode' else tmdb_id season = sys.listitem.getVideoInfoTag().getSeason() if dbtype == 'episode' else None episode = sys.listitem.getVideoInfoTag().getEpisode() if dbtype == 'episode' else None if tmdb_type == 'episode': # Passed episode details via script if not season or not episode: # Need season and episode for episodes return # Need season and episode if run from script so leave # Retrieve episode details so that we can get tmdb_id for episode episode_details = _plugin.tmdb.get_detailed_item(tmdb_type, parent_tmdb_id, season=season, episode=episode) tmdb_id = episode_details.get('infoproperties', {}).get('imdb_id') if dbtype == 'movie': tmdb_type = 'movie' elif dbtype == 'tvshow': tmdb_type = 'tv' elif dbtype == 'episode': tmdb_type = 'episode' else: return # Check if we're adding or removing the item and confirm with the user that they want to do that trakt_ids = func(utils.type_convert(tmdb_type, 'trakt'), 'tmdb', cache_refresh=True) boolean = 'remove' if int(tmdb_id) in trakt_ids else 'add' dialog_header = 'Trakt {0}'.format(action.capitalize()) dialog_text = xbmcaddon.Addon().getLocalizedString(32065) if boolean == 'add' else xbmcaddon.Addon().getLocalizedString(32064) dialog_text = dialog_text.format(utils.try_decode_string(label), action.capitalize(), tmdb_type, tmdb_id) dialog_text = dialog_text + ' Season: {} Episode: {}'.format(season, episode) if dbtype == 'episode' else dialog_text if not xbmcgui.Dialog().yesno(dialog_header, dialog_text): return with utils.busy_dialog(): slug_type = 'show' if tmdb_type == 'episode' else utils.type_convert(tmdb_type, 'trakt') trakt_type = utils.type_convert(tmdb_type, 'trakt') slug = _traktapi.get_traktslug(slug_type, 'tmdb', parent_tmdb_id) item = _traktapi.get_details(slug_type, slug, season=season, episode=episode) items = {trakt_type + 's': [item]} func(slug_type, mode=boolean, items=items) dialog_header = 'Trakt {0}'.format(action.capitalize()) dialog_text = xbmcaddon.Addon().getLocalizedString(32062) if boolean == 'add' else xbmcaddon.Addon().getLocalizedString(32063) dialog_text = dialog_text.format(tmdb_id, action.capitalize()) xbmcgui.Dialog().ok(dialog_header, dialog_text) xbmc.executebuiltin('Container.Refresh')